意外结果,Gnu C中的三元运算符

Jas*_*ick 1 c conditional ternary-operator operator-precedence ternary

所以三元运算符的运算符优先级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;
}
Run Code Online (Sandbox Code Playgroud)

这看起来类似于这里的问题:
C++三元条件和赋值运算符优先级
三元运算符求值顺序

作为澄清,我理解括号使其有效,正如我在原帖中的评论所表明的那样......

我只是想知道为什么语言作者会选择一种很有可能欺骗人们的评估方法,当第一个语句似乎可以在编译器方面被认为是有效的.

但是这些问题涉及左侧或类成员中的操作员,因为这种奇怪的行为发生在RHS上.

pmr*_*pmr 6

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

(11 + (k != 7)) ? 1 : 11
Run Code Online (Sandbox Code Playgroud)

第二个被解释为

 11 + ((k !=7) ? 1 :11)
Run Code Online (Sandbox Code Playgroud)

第一种是由优先规则引起的(二进制算术优先于三元运算符),第二种是通过用括号对表达式进行分组来绕过优先规则.

你的编辑询问原因,通常只能猜测那些,除非当时在场的C委员会有人来帮忙.我的猜测是,使用复杂表达式并询问其真值比使用三元运算符来确定算术中表达式的值更为常见.想到这样的事情:

return (froble() + 3) == 0 ? 23 : 5; // parens for sanity but works without
Run Code Online (Sandbox Code Playgroud)

如果这被解释为return (froble() + 3) == 5;我真的会感到震惊.