先说结论,& | 操作符总是计算全部条件,&& || 当计算可以得出最终结果,剩下条件不计算。

实验完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*
C 语言条件运算中 || && 与 | & 区别探究
*/

#include<stdio.h>

int main(){
int n1,n2;
do{
scanf("%d%d",&n1,&n2);
or_double(n1,n2);
or_single(n1,n2);
and_double(n1,n2);
and_single(n1,n2);
puts("\n");
}while (1);
return 0;
}

void or_double(int n1,int n2){
if(n1++ || n2++)
printf("|| 真 n1=%d n2=%d\n",n1,n2);
else
printf("|| 假 n1=%d n2=%d\n",n1,n2);
}

void or_single(int n1,int n2){
if(n1++ | n2++)
printf("| 真 n1=%d n2=%d\n",n1,n2);
else
printf("| 假 n1=%d n2=%d\n",n1,n2);
}

void and_double(int n1,int n2){
if(n1++ && n2++)
printf("&& 真 n1=%d n2=%d\n",n1,n2);
else
printf("&& 假 n1=%d n2=%d\n",n1,n2);
}

void and_single(int n1,int n2){
if(n1++ & n2++)
printf("& 真 n1=%d n2=%d\n",n1,n2);
else
printf("& 假 n1=%d n2=%d\n",n1,n2);
}

验证输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
0 0
|| 假 n1=1 n2=1
| 假 n1=1 n2=1
&& 假 n1=1 n2=0 # n2=0 即第一个条件可得出为最终为假,第二个条件没有计算
& 假 n1=1 n2=1 # n2=1 即第一个条件可得出为最终为假,第二个条件仍然计算


0 1
|| 真 n1=1 n2=2
| 真 n1=1 n2=2
&& 假 n1=1 n2=1
& 假 n1=1 n2=2


1 0
|| 真 n1=2 n2=0 # n2=0 即第一个条件可得出最终为真,第一个条件没有计算
| 真 n1=2 n2=1 # n2=1 即第一个条件可得出最终为真,第二个条件仍然计算
&& 假 n1=2 n2=1
& 假 n1=2 n2=1


1 1
|| 真 n1=2 n2=1
| 真 n1=2 n2=2
&& 真 n1=2 n2=2
& 真 n1=2 n2=2