1

所以三元运算符 in 的运算符优先级对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++ 三元条件和赋值运算符优先级
三元运算符评估顺序

作为澄清,我知道括号使它起作用,正如我在原始帖子中的评论所表明的那样......

我只是想知道为什么语言作者会选择一种可能会欺骗人们的评估方法,而第一个语句似乎可以在编译器方面进行格式化以使其有效。

但是这些问题涉及左侧或类成员内的运算符,因为这种奇怪的行为发生在 RHS 上。

4

2 回答 2

6

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

(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;我真的会感到震惊。

于 2012-03-19T00:13:22.070 回答
0

一个人应该选择一个非常高或非常低的优先级,其中一个或另一个会让做出错误假设的人感到惊讶。

选择低优先级的一个有用原因是它意味着运算符的功能类似于 if .. then .. else .. 没有任何大括号的构造,这可能意味着编译器编写者的工作量更少(他们可能使用相同的代码来处理两者) ,以及由了解优先级的编码人员直接重构。

在实践中,该语言可能标准化了在标准化前时代编写的代码中最流行的任何优先级。

于 2016-03-17T22:47:16.357 回答