c/c++语言开发共享C ++三元运算符执行条件

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

int foo(const bool addressGood, const int* ptr) { if (addressGood) { return ptr[0]; } else { return 0; } } 

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

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

谢谢。

    是的,该标准保证只有在addressGood为真时才访问ptr 。 请参阅此主题的答案 ,引用标准:

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

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

    我会说,除了答案“是的,它是由C ++标准保证的”:

    请使用第一个表格。 你想要实现的目标更加清晰。

    我几乎可以保证任何理智的编译器(具有最小的优化量)都会为两个示例生成完全相同的代码。

    因此,虽然知道这两种forms都实现相同的“保护”是有用的,但绝对优选使用最易读的forms。

    这也意味着你不需要写一个评论来解释它是安全的,因为C ++标准中的段落是这样的,因此使得它们占用相同数量的代码空间 – 因为如果你之前不知道它,那么你可以依赖别人也不知道这是安全的,然后花半个小时通过谷歌找到答案,并且要么遇到这个线程,要么再次提问!

    如果第一个操作数比较不等于0,则条件(三元)运算符保证仅计算第二个操作数,并且如果第一个操作数比较等于0,则仅计算第三个操作数。这意味着您的代码是安全的。

    在评估第一个操作数之后还有一个序列点。

    顺便说一句,你不需要addressGood ? ptr[0] : 0addressGood ? ptr[0] : 0 addressGood ? ptr[0] : 0也没关系。

    C ++ 11 / [expr.cond] / 1

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

      以上就是c/c++开发分享C ++三元运算符执行条件相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/549478.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐