我不确定 C / C++ 三元运算符的执行保证。
例如,如果给我一个地址和一个布尔值来判断该地址是否适合读取,我可以使用 if/else 轻松避免读取错误:
int foo(const bool addressGood, const int* ptr) {
if (addressGood) { return ptr[0]; }
else { return 0; }
}
然而,三元运算符 (?:
)保证ptr
不会被访问,除非addressGood
是真的?
或者优化编译器可以生成访问的代码ptr
在任何情况下(可能会使程序崩溃),将值存储在中间寄存器中并使用条件赋值来实现三元运算符?
int foo(const bool addressGood, const int* ptr) {
// Not sure about ptr access conditions here.
return (addressGood) ? ptr[0] : 0;
}
Thanks.
是的,该标准保证ptr
仅在以下情况下才被访问addressGood
是真的。看这个答案 https://stackoverflow.com/a/14763151/2530166关于该主题,引用了标准:
条件表达式从右到左分组。第一个表达式根据上下文转换为 bool(第 4 条)。对其进行求值,如果为真,则条件表达式的结果是第二个表达式的值,否则为第三个表达式。仅计算第二个和第三个表达式之一。与第一个表达式相关联的每个值计算和副作用都在与第二个或第三个表达式相关联的每个值计算和副作用之前排序。
(C++11 标准,第 5.16/1 段)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)