c - 如果前缀增量运算符具有从右到左的结合性,这怎么可能?

标签 c

 main()
   {
      int i=-3, j=2;
      int m = ++i || ++j;
      printf("%d %d",i,j);
   }

如果前缀增量运算符具有从右到左的结合性,则++j 应该首先执行。但这里只有++i 执行而++j 不执行。为什么?

最佳答案

您的观察与运算符结合性无关,而是与二元逻辑运算符执行顺序的定义有关。

您正在使用++j 作为逻辑运算的第二个运算符。在 C 语言中,二元逻辑运算符有一个“提前退出”,即只要进一步执行不再改变结果,就停止执行。这是 || 的左操作数时的情况计算结果为 TRUE,或者 && 的左操作数计算结果为 FALSE。在前一种情况下,无论其他操作数产生什么,结果都是 TRUE。在后一种情况下,它是 FALSE,进一步的评估不会改变它。

如果您将函数用作逻辑运算符的操作数,则此语言功能非常重要。它保证按指定顺序调用函数,并且仅评估那些对结果有贡献的函数。

在您的示例中,您评估:

int m = ++i || ++j;

因为 i == -3,++i 产生 -2,它不是 0,因此被解释为 TRUE。所以||的评价停在这里,j 没有被触及。

关于c - 如果前缀增量运算符具有从右到左的结合性,这怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45535753/

相关文章:

将 8 位转换为等效的缩放 12 位

c - 如果我在 C 中省略了 main 函数的返回类型怎么办?

c - 指向数组的指针数组

c - 指定动态数组初始化

c++ - 如何在 Turbo C++ 16 位编译器中创建项目

c - char *envp[] 是 main() 可移植的第三个参数吗

c++ - C fmod 函数 : Floating point error and optimization

c - Malloc 中的 Strlen

c - 如何在 C 脚本中分配从命令行传递的文件名?

c - 求解带状矩阵方程组