开门见山,直接展示代码 (以下编译环境是在windows平台visual studio2019)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("i = %d\na = %d\nb = %d\nc = %d\nd = %d\n",i,a,b,c,d);
return 0;
}
问题:计算i,a,b,c,d 五个值的大小。
首先,题目并不长,考察的是细节知识点的理解和掌握。这题主要考察的有两个知识点
首先a++的含义就是先执行语句,再进行自增操作。 而 ++a的含义是先进行自增操作,然后再执行语句。
逻辑与运算符 a && b :符号两边都为真才为真; 逻辑或运算符 a || b :符号两边都为假才为假。
逻辑运算按照从左—>右的方向执行,若前面的语句能够直接判断改逻辑的值,则直接结束运算。 举例说明: a&&b ,a为假(0) 则必为假,不执行b a || b ,a为真(非0)则必为真,不执行b
上述例子中B都没有执行,则说明b被逻辑短路了。
1.先判断运算优先级,其中赋值语句(==)的优先级是最小的,并且自增自减的运算符优先级大于逻辑运算符。
*附C语言中运算符优先级图标
2.计算过程 由于逻辑运算符是左->右执行,所以限制性a++,由于a++的特性先执行后自增,导致a++再逻辑语句中仍为 0 ,并且逻辑运算符是&&,a++为0直接判断出整个逻辑语句为假(0),所以i = 0; ++b和d++语句不执行。,执行完i的赋值语句后a++自增,所以a = 1。
结果如下图:
变式题:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ || ++b && d++;
printf("i = %d\na = %d\nb = %d\nc = %d\nd = %d\n",i,a,b,c,d);
return 0;
}
同理可得: i = 1,a = 1, b= 3, c = 3, d = 4。