C:"?:"运算符表达式等价

时间:2015-09-30 21:19:34

标签: c

几天前,我写了一个函数,它接收的int大于0并返回第n个素数。我想知道可写的短了多少,我想出了这个:

int f(int i){int n=2,d=2,j=1;for(j;j<i;j+=n==d)n%d<1?n++,d=2:d++;return n;}

然后我在for中看到n%d&lt; 1并且想到为什么不用n%d改变它并反转&#34;?的顺序:&#34;运算符表达式,如下所示:

int g(int i){int n=2,d=2,j=1;for(j;j<i;j+=n==d)n%d?d++:n++,d=2;return n;}

但它不起作用,它陷入无限循环。我想,d = 2实际上从未发生过。任何人都可以指出我为什么不读或读什么来解决它?

如果有任何帮助,我正在运行Ubuntu并仅使用gcc -std = c99进行编译。

2 个答案:

答案 0 :(得分:3)

这是运营商优先权的问题。 ?:的优先级高于,,因此

A , B ? C : D , E

解析为

A , (B ? C : D) , E

然而,这并不适用于?:的中间部分,它的作用就像它被parens包围一样(因为在某种意义上? ... :是一个包围结构) :

A ? B , C : D

解析为

A ? (B , C) : D

因为在没有语法错误的情况下,这是唯一可以做的事情。

您可以通过添加明确的parens来解决此问题:

n%d?d++:(n++,d=2);

答案 1 :(得分:2)

三元?:运算符的逗号为higher precedence。因此,

n%d?d++:n++,d=2

被解析为:

(n % d ? d++ : n++), d = 2

这不是你想要的。

它在你的第一个例子中起作用的原因是因为逗号在 ?:之间是,它们就像括号,花括号一样充当成对分隔符和方括号。