gpt4 book ai didi

c++ - 在条件运算符中使用对象两次会产生 UB 吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:06:26 26 4
gpt4 key购买 nike

据我所知,条件运算符(三元运算符“?”)保证了其操作数的求值顺序我想知道是否将 的返回值分配给变量? 其中变量在它的两个表达式之一中使用。是不是UB。这是我所拥有的:

我编写了这个程序,它根据字符串 str 是否包含有效数字字符来尝试将字符串转换为整数,例如:+-.0123456789,所以我在一个表达式中使用了 std::stoi 结合 std::string::find_first_of 和条件运算符:

std::string str = "a^%^&fggh67%$hf#$";
std::size_t pos = 0;
auto val = (((pos = str.find_first_of("0123456789.+-")) != std::string::npos) ?
std::stoi(str.substr(pos)) : -1);

std::cout << val << std::endl; // 67

str = "a^%^&fggh__#$!%$hf#$";
pos = 0;
val = (((pos = str.find_first_of("0123456789.+-")) != std::string::npos) ?
std::stoi(str.substr(pos)) : -1);

std::cout << val << std::endl; // -1

如您所见,这段代码看起来工作正常,我知道如果在 str 中意外找到值 -1,我们不知道是否 val 保存 -1 成功操作或失败(?运算符)。但是我只想知道我写的这段代码有没有UB?

  • 感谢在上一个主题 UB 中指导我的成员,我已经更正了它。

最佳答案

代码没有未定义的行为。条件运算符由 [expr.cond]/1 定义为

Conditional expressions group right-to-left. The first expression is contextually converted to bool. It is evaluated and if it is true, the result of the conditional expression is the value of the second expression, otherwise that of the third expression. Only one of the second and third expressions is evaluated. Every value computation and side effect associated with the first expression is sequenced before every value computation and side effect associated with the second or third expression.

强调我的

因此,((pos = str.find_first_of("0123456789.+-")) != std::string::npos) 被评估,一个序列点被“到达”,并且然后根据结果 std::stoi(str.substr(pos))-1 在其自己的序列表达式中求值。

关于c++ - 在条件运算符中使用对象两次会产生 UB 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57778234/

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