C++三元运算符执行条件

rsp*_*984 9 c c++ memory pointers conditional-statements

我不确定C/C++三元运算符的执行保证.
例如,如果给出一个地址和一个布尔值来告诉该地址是否适合阅读,我可以使用if/else轻松避免错误读取:

int foo(const bool addressGood, const int* ptr) {
    if (addressGood) { return ptr[0]; }
    else { return 0; }
}
Run Code Online (Sandbox Code Playgroud)

但是?:,ptr除非addressGood是真的,否则三元运算符()可以保证不会被访问?
或者优化编译器是否可以生成ptr在任何情况下访问的代码(可能使程序崩溃),将值存储在中间寄存器中并使用条件赋值来实现三元运算符?

int foo(const bool addressGood, const int* ptr) {
    // Not sure about ptr access conditions here.
    return (addressGood) ? ptr[0] : 0;
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

小智 10

是的,标准保证ptr仅在addressGood真实时才被访问.请参阅主题的答案,引用标准:

条件表达式从右到左分组.第一个表达式在上下文中转换为bool(第4条).它被评估,如果是,则条件表达式的结果是第二个表达式的值,否则是第三个表达式的值.仅评估第二和第三表达式中的一个.在与第二或第三表达式相关联的每个值计算和副作用之前,对与第一表达式相关联的每个值计算和副作用进行排序.

(C++ 11标准,第5.16/1段)