gpt4 book ai didi

c++ - 为什么这些示例中的一个是未定义行为而另一个不是?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:13 25 4
gpt4 key购买 nike

this 的评论回复声明不应使用以下代码,因为它表现出未定义的行为:

int old = (std::cin >> old, old);

类似的代码也被大大鄙视了here ,特别是表现出未定义的行为。

另一方面,this高度赞成的回复建议将以下代码作为逗号运算符的有用性示例:

while (cin >> str, str != "STOP") {
//process str
}

我假设如果这段代码表现出未定义的行为,它就不会被投票。

问题:如果第一个代码是未定义的行为(大概是因为使用了从cin读取的结果而不检查后者的状态),那么为什么是第二个代码好吗?

编辑:第一个例子的评论部分回答了这个问题。第二个示例没有显示的是 strstd::string 的一个实例,因此被初始化。因此,不存在未定义的行为。

最佳答案

声明 int old = (std::cin >> old, old); 自 C++11 以来定义明确 假设读取非空白字符。这是因为如果 std::cin 在这种情况下失败,则 old 将设置为零。 表达式分隔符 运算符 , 的使用也是合法的,因为它对表达式 std::cin >> oldold< 进行排序。如果没有反击非空白字符,则 old 仍未被 std::cin >> old 更改,并且代码的行为未定义。

假设 str 是一个 std::string 类型,(cin >> str, str != "STOP") 总是定义明确。如果 cin >> str 失败,则保留 str 的初始(可能是默认构造的)值,并再次 , 对表达式进行排序。

关于c++ - 为什么这些示例中的一个是未定义行为而另一个不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57848792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com