几天前,我写了一个函数,它接收的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进行编译。
答案 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
这不是你想要的。
它在你的第一个例子中起作用的原因是因为逗号在 ?
和:
之间是,它们就像括号,花括号一样充当成对分隔符和方括号。