我不确定C / C ++三元运算符的执行保证。
例如,如果给我一个地址和一个布尔值,指示该地址是否适合读取,则可以使用if / else轻松避免读取错误:
int foo(const bool addressGood, const int* ptr) {
if (addressGood) { return ptr[0]; }
else { return 0; }
}
但是,三元运算符(?:
)是否可以保证ptr
除非addressGood
为true,否则不会被访问?
还是优化的编译器可以生成ptr
在任何情况下都可以访问(可能会使程序崩溃)的代码,将值存储在中间寄存器中,并使用条件赋值来实现三元运算符?
int foo(const bool addressGood, const int* ptr) {
// Not sure about ptr access conditions here.
return (addressGood) ? ptr[0] : 0;
}
谢谢。
是的,该标准保证ptr
只有在addressGood
为true时才可以访问。请参阅有关该主题的标准答案:
条件表达式从右到左分组。第一个表达式在上下文中转换为bool(第4条)。将对其求值,如果为true,则条件表达式的结果为第二个表达式的值,否则为第三个表达式的值。仅计算第二和第三表达式之一。与第一个表达式关联的每个值计算和副作用在与第二个或第三个表达式关联的每个值计算和副作用之前进行排序。
(C ++ 11标准,第5.16 / 1段)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句