在条件运算符中使用对象两次会产生 UB 吗?
Does using an object in conditional operator twice yield UB?
正如我了解到的条件运算符(三元运算符"?"(保证其操作数的计算顺序 我想知道是否将返回分配给变量?
该变量在其两个 expr 之一中使用。 是否是 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 定义为
条件表达式从右到左分组。第一个表达式在上下文中转换为布尔值。它被计算,如果为 true,则条件表达式的结果是第二个表达式的值,否则是第三个表达式的值。仅计算第二个和第三个表达式中的一个。与第一个表达式关联的每个值计算和副作用在与第二个或第三个表达式关联的每个值计算和副作用之前进行排序。
强调我的
因此,((pos = str.find_first_of("0123456789.+-")) != std::string::npos)
被评估,一个序列点被"到达",然后根据结果,std::stoi(str.substr(pos))
或-1
在其自己的序列表达式中被评估。
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++两次定义相同的函数会导致错误
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 使用柯南打包时如何避免列出两次依赖?
- 为什么要执行两次位移((x >> 4)<< 4)?
- 对结构向量进行两次排序
- 在条件运算符中使用对象两次会产生 UB 吗?
- 由于在序列点之间修改变量两次而导致的 UB 是否会转移到"inner"范围?