#include <stdio.h>
int main()
{
int a = 1;
int b = 1;
int c = a || --b;
int d = a-- && --b;
printf("a=%d, b= %d, c= %d, d= %d",a,b,c,d);
return 0;
}
在上面的代码中,我期望输出是,a=0, b= -1, c= 1, d= 0
但输出是a=0, b= 0, c= 1, d= 0
#include <stdio.h>
int main()
{
int a = 1;
int b = 1;
int c = a || --b;
int d = a-- && --b;
printf("a=%d, b= %d, c= %d, d= %d",a,b,c,d);
return 0;
}
在上面的代码中,我期望输出是,a=0, b= -1, c= 1, d= 0
但输出是a=0, b= 0, c= 1, d= 0
在此声明中用作初始值设定项的表达式中
int c = a || --b;
由于操作数a
不等于 0,--b
因此不计算表达式。
所以变量c
由 初始化1
。
来自 C 标准(6.5.14 逻辑或运算符)
4 不同于按位 | 运算符,|| 运算符保证从左到右的评估;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较不等于 0,则不计算第二个操作数。
在 tjis 声明中用作初始值设定项的表达式中
int d = a-- && --b;
操作数a--
不等于 0(后缀运算符的值是其操作数在递减之前的值)。所以操作数--b
被评估。因为它的值等于0
然后变量d
被初始化0
。
来自 C 标准(6.5.13 逻辑与运算符)
4 与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。
因此a
,b
在此声明之后将等于 0。