3.5-day05-C语言基础
, 操作符可以连接多个独立的操作
++自增操作符和--自减操作符可以对变量进行操作,把变量内部的数字加一或者减一。这两个操作符写在变量前面的时候优先级非常高,写在后面的时候优先级非常低。
C语言中支持如下逻辑操作符(==,!=,>,>=,<,<=,&&和||)
&&和||具有短路特性
!也是一个逻辑操作符,可以对一个逻辑表达式的结果求反。
数学操作符优先级高于逻辑操作符
&表示按位与,可以对两个二进制补码进行计算得到一个新的二进制补码。它可以把某个补码中特定的位置清0。
|表示按位或,可以对两个二进制补码进行计算得到一个新的二进制补码。它可以把某个补码中特定的位置设置成1。
^表示按位亦或。它可以把某个已知的补码中特定位置变成相反数字。
~表示按位求反,可以对一个二进制补码进行计算得到一个新的二进制补码。
<<表示左移操作,可以把一个补码向左移动指定的位数。如果移动后没有丢失有效信息则新数据是原有数据的2的n次方倍。
>>表示右移操作,可以把一个补码向右移动制定的位数。如果被移动的数字是无符号数则左边补充0,否则左边补充符号位。如果移动后没有丢失有效信息则原数据是新数据的2的n次方倍。
三目操作符可以根据一个逻辑表达式的结果从两个不同的计算过程中选择一个来使用。
C语言中可以使用强制类型转换把任何一个数据当成任何一种类型来使用。
隐式类型转换会把占地小的数据转换成占地大的数据,如果数据大小一样会把有符号的数据转换成无符号的数据。
分支语句可以用来处理分叉的情况,if语句是一种分支处理语句,使用方法如下
if (逻辑表达式1) { //有并且只能有一个
处理语句1
}
else if (逻辑表达式2) { //可能没有也可能有很多
处理语句2
}
else { //可能没有,最多一个
处理语句3
}
01opr.c
/* 操作符练习 */ #include <stdio.h> int shu_zi2 = 3; int main() { int shu_zi = 0, shu_zi1 = 0; //shu_zi = 3, 7; shu_zi = (3, 7); printf("shu_zi是%d\n", shu_zi); //shu_zi++; //++shu_zi; //shu_zi--; --shu_zi; printf("shu_zi是%d\n", shu_zi); //shu_zi1 = ++shu_zi; //两个变量内部都是7 shu_zi1 = shu_zi++; printf("shu_zi是%d,shu_zi1是%d\n", shu_zi, shu_zi1); 7 ,6 操作符写在变量前优先级非常高,写在后面优先级低 shu_zi1 = shu_zi++ + ++shu_zi; printf("shu_zi是%d,shu_zi1是%d\n", shu_zi, shu_zi1); 9 ,16 通过++shu_zi=8, shu_zi1 = 8+8=16; 然后,shu_zi++变为9 shu_zi1 = shu_zi2++ + ++shu_zi2;16 printf("shu_zi1是%d,shu_zi2是%d\n", shu_zi1, shu_zi2); 8 , 5 通过++shu_zi2=4, shu_zi1 = 4+4=8; 然后,shu_zi2++变为5 return 0; }7

如果程序经过修改如下:


02logic.c
/* 逻辑操作符练习 */ #include <stdio.h> int main() { int shu_zi = 0; printf("3 == 5是%d\n", 3 == 5); printf("3 != 5是%d\n", 3 != 5); printf("3 > 5是%d\n", 3 > 5); printf("3 < 5是%d\n", 3 < 5); printf("3 >= 5是%d\n", 3 >= 5); printf("3 <= 5是%d\n", 3 <= 5); printf("3 < 7 < 5是%d\n", 3 < 7 < 5); // 1,具有短路特性 printf("3 < 7 && 7 < 5是%d\n", 3 < 7 && 7 < 5); printf("3 < 7 || 7 < 5是%d\n", 3 < 7 || 7 < 5); 3 > 5 && ++shu_zi; printf("shu_zi是%d\n", shu_zi); //0, &&具有短路特性, ++shu_zi不执行 3 < 5 || ++shu_zi; printf("shu_zi是%d\n", shu_zi); //0, ||具有短路特性,++shu_zi不执行 printf("!6是%d\n", !6); // 0 printf("5 + 3 > 4是%d\n", 5 + 3 > 4); //进行逻辑运算判断时,0为假,非0值为真,习惯上用1来表示真,其它非零值也可以! return 0; }

进行逻辑判断时,0为假,非0值为真,习惯上用1来表示真,其他非零值也可以表示真;
所以 !6 为 0;
03bit.c
/* 位操作符 */ #include <stdio.h> int main() { printf("3 & 5是%d\n", 3 & 5); printf("3 | 5是%d\n", 3 | 5); printf("3 ^ 5是%d\n", 3 ^ 5); printf("~0xffffff96是0x%x\n", ~0xffffff96); return 0; }

按位与&:两个都为1,则为1;
按位或 | :有一个为1,就为1;
按位异或 ^:当两对应的二进位相异时,结果为1;
按位求反~
04addr.c
/* 地址操作符 */ #include <stdio.h> int main() { int shu_zi = 0; printf("%p\n", &shu_zi); *(&shu_zi) = 3; printf("shu_zi是%d\n", shu_zi); return 0; }
%p 是以16进制的形式输出内存地址;
格式控制符“%p”中的p是pointer(指针)的缩写。指针的值是语言实现(编译程序)相关的,但几乎所有实现中,指针的值都是一个表示地址空间中某个存储器单元的整数。printf函数族中对于%p一般以十六进制整数方式输出指针的值,附加前缀0x。

05shift.c
/* 移位操作 */ #include <stdio.h> int main() { printf("0xabcdef89 << 2是0x%x\n", 0xabcdef89 << 2); printf("0xabcdef89 >> 2是0x%x\n", 0xabcdef89 >> 2); printf("(int)0xabcdef89 >> 2是0x%x\n", (int)0xabcdef89 >> 2); return 0; }

<<左移;如果移动后没有丢失有效信心则新数据是原有数据的2的n次方倍;
>>右移;被移动的是无符号数,则左边补充0;否则左边补充符号位;
如果移动后数据没有丢失有效信息,则原数据是新数据的2的n次方倍
比如:
(int)0xabcdef89 >> 2是0x%x\n
对于有符号的数据类型右移左边补充原来的符号位;
06tri.c
/* 三目操作符练习 */ #include <stdio.h> int main() { int shu_zi = 32; shu_zi = shu_zi < 0 ? 0 - shu_zi : shu_zi; printf("shu_zi是%d\n", shu_zi);

07tri.c
/* 三目操作符练习 */ #include <stdio.h> int main() { int shu_zi = 0; printf("请输入一个数字:"); scanf("%d", &shu_zi); shu_zi = shu_zi >= 100 ? shu_zi - 100 : 100 - shu_zi; printf("距离是%d\n", shu_zi); return 0; }

08type.c
/* 强制类型转换练习 */ #include <stdio.h> int main() { int shu_zi = 300; printf("%d\n", (unsigned char)shu_zi); printf("%d\n", shu_zi); return 0; }

unsigned char : 0 - 255
0 - 256
44 - 300 ,转换成unsigned char,存在内存的溢出;
09type.c
/* 隐式类型转换练习 */ #include <stdio.h> int main() { int shu_zi = -10; unsigned int shu_zi1 = 3; shu_zi = (shu_zi + shu_zi1) > 0 ? 1 : -1; printf("计算结果是%d\n", shu_zi); printf("大小是%d\n", sizeof(3 < 5 ? 1 : 0.9)); return 0; }

隐式类型转换:
整型提升;
如果数据大小一样会把有符号的数据转换为无符号的数据;
int 占4个字节,8位;
那么,shu_zi 真正的结果是多少呢?


结果是-7,但>0;
原因:原来有符号数和无符号数进行比较运算时(==,<,>,<=,>=),
有符号数隐式转换成了无符号数(即底层的补码不变,但是此数从有符号数变成了无符号数);
比如上面的-10+3=-7这个比较运算,-7的补码为1111 1001,
此数进行比较运算时,被当成了无符号数,它远远大于0,所以得到上述结果。
10if.c
/* if练习 */ #include <stdio.h> int main() { int shu_zi = 0; printf("请输入一个整数:"); scanf("%d", &shu_zi); if (shu_zi > 0) { printf("正数\n"); } else if (shu_zi < 0) { printf("负数\n"); } else { printf("零\n"); } return 0; }

11if.c
/* if练习 */ #include <stdio.h> int main() { int shu_zi = 0; printf("请输入一个数字:"); scanf("%d", &shu_zi); if (shu_zi % 2) { printf("奇数\n"); if (!(shu_zi % 5)) { printf("能被5整除\n"); } } else { printf("偶数\n"); } /*if (!(shu_zi % 5) && (shu_zi % 2)) { printf("能被5整除\n"); }*/ return 0; }

if (shu_zi % 2) 奇数,执行;
if (!(shu_zi % 5))能被5整除,! 0 = 1,则继续执行;
注意if条件判断,值为1就是真,继续执行;否则,跳转;
浙公网安备 33010602011771号