1. 与(&&)和或(||)具有短路特性,即如果前一个表达式的结果能够决定&&或者||的最终结果,则后一个表达式不会被计算。
1 /*
2 *&&和||的短路特性
3 * */
4
5 #include<stdio.h>
6 int main(){
7 int num = 0;
8 0 && ++num;
9 printf("%d\n", num);
10
11 1 || ++num;
12 printf("%d\n", num);
13
14 1 && ++num;
15 printf("%d\n", num);
16
17 0 || ++num;
18 printf("%d\n", num);
19 return 0;
20 }
结果:
0
0
1
2
因此在逻辑表达式中最好不要修改变量的内容!
2.位操作符对字节中的二级制位进行操作,双目位操作符把两个数字在字节中的二进制样式对应数位进行操作。
按位与(&)把对应数位上的数字进行与计算:0&0=0;1&0=0;1&1=1
例如3&5=1:
0000 0011
0000 0101
0000 0001
按位与可以把一个字节长得某些二进制位清0,因为任何位和1按位与结果不变,和0与结果为0,例如判断一个数是不是偶数:!(num & 1)
按位或:0|0=0; 0|1=1; 1|1=1
例如3|5=7:
0000 0011
0000 0101
0000 0111
按位或可以把一个字节的某些数位设置位1,因为任何数位与0或不变,与1或为1
按位异或(^)相同为0,不同为1:0^0=0;1^1=0,1^0=1
例如3^5=6
0000 0011
0000 0101
0000 0110
按位异或可以对某些二进制位进行求反,因为任何二进制位和0异或不变,和1异或结果一定变化
~是单目位操作符,表示一个字节中所有二进制位按位求反
3.移位操作符把一个字节中的所有数位统一左移或者右移若干位,左移<<, 右移>>.例如3<<2表示3的所有数位左移2位,结果为12.
移位过程中,多余的丢弃,
左移中右边空出的数位填充0;
右移操作中,有符号数字一定填充符号位,无符号数字一定填充0
如果移位操作过程中没有丢失有效数据,则右移n位,相当于除以2的n次方,左移相当于乘2的n次方
最小整数:1<<31,
最大整数:~(1<<31)
4.&获得一个变量对应的存储位置的地址,%p是和地址配对的占位符; *操作符可以根据地址数据表示对应的存储位置,并且可以直接对该存储位置进行赋值。
5.三目操作符可以根据一个布尔值从两个不同表达式中挑一个来使用
格式:布尔值?表达式1:表达式2
当布尔值为真时,采用表达式1进行计
算,否则采用表达式2计算
1 /*
2 *小写字符转换成大写
3 * */
4
5 #include<stdio.h>
6 int main(){
7 char ch;
8 printf("请输入一个英文字母:");
9 scanf("%c", &ch);
10 ch = 'a' <= ch && ch <= 'z' ? ch + 'A'-'a':ch;
11 printf("转换结果是:%c", ch);
12 return 0;
13
14 }
~
1 /*
2 *四则表达式练习
3 * */
4
5 #include<stdio.h>
6 int main(){
7 char ch=0;
8 int num = 0, num1 = 0;
9 printf("请输入一个表达式:");
10 scanf("%d%c%d", &num, &ch,&num1);
11 num = ch=='+' ? num+num1 : ch=='-' ? num-num1:num*n um1; //只考虑+-*
12 printf("结果是:%d", num);
13 return 0;
14 }
6.如果一个表达式中包含多个不同的类型数据,则首先把他们转化为同一类型,然后计算;
这个转化过程是由计算机自动完成的,叫做隐式类型转换,将占地小的数据类型转化为占地大的数据类型。当多个数据所占大小一样的时候把整数转化为浮点数,把有符号的转换成无符号数。注意只是计算机在进行计算时隐式的进行转化,原有变量是不会发生变化的。
1 /*
2 *类型转换演示
3 * */
4
5 #include<stdio.h>
6 int main(){
7 printf("结果是:%d\n", sizeof(1?1:0.9));
8 printf("-7+3>0的结果是:%d\n", -7+3>0);
9
10 printf("-7+3>0的结果是:%d\n", -7+3u>0);
11 return 0;
12
13 }
结果是:
8
0
1
7、强制类型转化是临时生成一个新数据,使用旧数据对新数据进行赋值,以后的操作中使用新数据;因此旧数据不会发生变化。