几天前我编写了一个函数,它接收一个大于 0 的整数 n 并返回第 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<1,我想为什么不只用 n%d 来改变它并反转“?:”运算符表达式的顺序,就像这样:
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 进行编译。
最佳答案
这是运算符优先级的问题。 ?:
比,
有更高的优先级,所以
A , B ? C : D , E
解析为
A , (B ? C : D) , E
但是,这不适用于 ?:
的中间部分,它就像被括号包围一样(因为在某种意义上 ?
... :
是一个括号结构):
A ? B , C : D
解析为
A ? (B , C) : D
因为这是唯一不会出现语法错误的事情。
您可以通过添加显式括号来解决此问题:
n%d?d++:(n++,d=2);
关于C: "?:"运算符表达式等价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32875822/