跳到主要内容

C语言运算符优先级

自从我看见这俩玩意:

,我就意识到学习运算符的优先级还是很重要的。

《C语言运算符100例》优先级面试错题_c语言运算符优先级题目-CSDN博客

运算符的结合性指的是当有相同优先级的运算符出现时,运算符怎么结合。

例题43

#include <stdio.h>
int a[5] = {9, 8, 7, 6, 5};
int main() {
int *p = a;
printf("%d\n", *p++);
return 0;
}

【运行结果】9
【结果答疑】这个例子中,*++的优先级是相同的,但是无奈这两个的结合性是从右到左的,所以它等价于*(p++),而且p++表达式的值等于p。所以最后解引用的还是数组的第一个元素。

例题44

#include <stdio.h>
int a[5] = {9, 8, 7, 6, 5};
int main() {
int *p = a;
printf("%d\n", *++p);
return 0;
}

【运行结果】8
【结果答疑】这个例子是用来类比【例题43】的,它输出则是数组的第2个元素的值。

例题59

#include <stdio.h>
int main() {
int a = 0b1010;
int b = 0b0110;
printf("%d\n", a & b );
return 0;
}

【运行结果】2
【结果答疑】这个例子展示了位与的基本运算。

例题60

#include <stdio.h>
int main() {
int a = 0b1010;
int b = 0b0110;
printf("%d\n", a & b == 2);
return 0;
}

【运行结果】0
【结果答疑】延续【例题59】继续看,之前a & b输出的是2,那为什么加上等于==判定后,输出结果反而变成0了呢?原因是因为==的优先级高于位与&,所以相当于进行了a & 0的操作,结果自然就是0了。

例题80

#include <stdio.h>
int main() {
int a = 1;
--a && --a;
printf("%d\n", a);
return 0;
}

【运行结果】0
【结果答疑】这个例子是展示逻辑或运算符&&从左往右计算过程中,一旦遇到 0 就不再进行运算了,所以--a实际上只执行了一次。

例题82

#include <stdio.h>
int main() {
int a = 0;
--a || --a;
printf("%d\n", a);
return 0;
}

【运行结果】1
【结果答疑】这个例子是展示逻辑或运算符从左往右计算过程中,一旦遇到 1 就不再进行运算了,所以--a实际上只执行了一次。

例题96

#include <stdio.h>
int main() {
int a = 1, b = 2, c = 3;
printf("%d\n", a < b ? b > c ? 9 : 7 : a - b );
return 0;
}

【运行结果】7
【结果答疑】这个例子主要是用来解释条件运算符的结合性是从右到左的,等价于a < b ? (b > c ? 9 : 7) : a - b

例题97

#include <stdio.h>
int main() {
int a = 2, b = 3;
printf("%d\n", a <<= a < b ? a + b : a - b );
return 0;
}

【运行结果】64
【结果答疑】这个例子主要是说明赋值运算符的优先级低于条件运算符。即a <<= a < b ? a + b : a - b等价于a <<= (a < b ? a + b : a - b)

例题100

逗号运算符的优先级最低。