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

标签 c

几天前我编写了一个函数,它接收一个大于 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/

相关文章:

c - macOS 上的段错误,但 Ubuntu 上没有

arrays - 在 C 中初始化了一个指针数组 - 可能无法初始化可变大小的对象

javascript - 将javascript代码转换为c代码

c - 我在C中的“最大回文产品”程序不起作用

C - 进程退出,错误代码为 3221225477

c - 未初始化信号量的值

c - C语言中如何将函数结果保存到文本文件中

c - 涡轮C++ : Unable to open include file stdio. h

c - `printf` 中的 %*c%*c 是什么?

c - 如何检测接收到长度为 0 的 UDP 数据报