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/