由于我了解到条件运算符(三元运算符“?”)保证了其操作数的求值顺序,我想知道是否在使用此变量的情况下将变量?
返回给变量在它的两个表达式之一中。是否成为UB。这是我所拥有的:
我已经编写了此程序,尝试根据字符串str
是否包含有效的数字字符将字符串转换为整数,例如:+-.0123456789
,所以我使用了{{1} }与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
中找到了值-1
,我们不知道str
是否持有{{ 1}}成功操作或失败(?运算符)。但是我只想知道我编写的这段代码是否具有UB?
答案 0 :(得分:6)
该代码没有未定义的行为。 [expr.cond]/1将条件运算符定义为
条件表达式从右到左分组。第一个表达式在上下文中转换为bool。对其进行评估,如果为真,则条件表达式的结果为第二个表达式的值,否则为第三个表达式的值。仅计算第二和第三表达式之一。 与第一个表达式相关的每个值计算和副作用要在与第二个或第三个表达式相关的每个值计算和副作用之前进行排序。
强调我的
因此,对((pos = str.find_first_of("0123456789.+-")) != std::string::npos)
进行求值,“到达”序列点,然后根据结果std::stoi(str.substr(pos))
或-1
在其自己的序列表达式中求值。