所以在我看来,C中的三元运算符的优先顺序真的很奇怪案例说明:

#include <stdio.h>

int main ()
{
   int i=5;
   int j=6;
   int k=7;
   printf("A: %d\n", i+j+(k!=7)?1:11); //prints 1
   printf("B: %d\n", i+j+((k!=7)?1:11)); //prints 22
   return 0;
}

这似乎与这里的问题类似:
C++ ternary conditional and assignment operator precedence
Ternary operator evaluation order
作为一个澄清,我明白括号让它起作用,正如我在我的原始帖子中的评论所指出的。。。
我只是想知道为什么语言作者会选择一个很可能欺骗人们的求值方法,而第一条语句似乎可以通过编译器的格式化使其有效。
但是这些问题涉及到左边或类成员中的操作符,在RHS中,这种奇怪的行为发生在那里。

最佳答案

这里有什么奇怪的第一部分解释为:

(11 + (k != 7)) ? 1 : 11

第二个解释是
 11 + ((k !=7) ? 1 :11)

第一种是由优先规则引起的(二进制算术比三元运算符具有更高的优先权),第二种是通过用括号将表达式分组来绕过优先规则。
你的编辑会询问原因,除非当时在场的C委员会有人来帮忙,否则通常只能猜测原因。我的猜测是,在算术中使用复杂表达式并要求其真值比使用三元运算符来确定表达式的值要常见得多。我想到了这样的事:
return (froble() + 3) == 0 ? 23 : 5; // parens for sanity but works without

如果这被解释为return (froble() + 3) == 5;我会非常震惊。

关于c - 结果出乎意料,Gnu C中的三元运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9763483/

10-12 02:58