这是我在入门级计算机编程课程中遇到的示例代码:
#include <stdio.h>
int main()
{
int l = 20, m = 10;
int z;
z= l++ || m++;
printf("z = %d l = %d m = %d\n", z, l, m);
}输出l和z的l=21、m=10和z=1值的代码是我所期望的,但m的值让我感到困扰。它不应该是11吗,因为m++出现在代码中。
发布于 2017-02-06 19:41:13
这是因为只有在l++ == 0的情况下才会执行m++。由于l++的计算结果为20,因此永远不会执行m++。如果l最初为0,则将执行m++。
发布于 2017-02-06 19:43:04
z= l++ || m++;在表达式中,l首先赋值,然后递增1。
在逻辑或(||)运算中,如果左操作数为非零,则右操作数为且结果为true。这就是为什么l变成21,而m不求值,它的值是10。
C标准(N1256:6.5.14-第4段)说的是:
与按位运算符不同,||运算符保证从左向右求值;在第一个操作数求值之后有一个序列点。如果第一个操作数不等于0,则第二个操作数不会被计算为。
发布于 2017-02-06 19:53:35
你所看到的就是短路评估。
你的这一行:
z= l++ || m++;也就是说,检查l的值(检查时递增)。如果l不为0,则将z设置为1。如果l为0,则检查m的值(检查时递增)。如果m不为0,则将z设置为1。否则,将z设置为0。
本质上,当两个检查中的第一个(l++)已经计算为真时,系统不需要检查第二个条件,因此它不需要检查,因此也无法增加m。
https://stackoverflow.com/questions/42066827
复制相似问题