选择结构-if
if(表达式) {}
{}为作用域
多重if-else 例如:
#include <stdio.h> int main(){ int amount = 888888; if(amount<=0){ printf("没有购物不能获奖"); }else if(amount%888==0){ printf("恭喜你获得一等大奖!"); }else if(amount%88==0){ printf("恭喜你获得二等奖"); }else if(amount%8==0){ printf("恭喜你获得鼓励奖"); }else{ printf("谢谢参与"); } return 0; }
嵌套if-else 例如:
#include <stdio.h> int main(){ double speed = 10.71; //百米速度 int male = 1; //1代表男,0代表女 if(speed<12){ if(male){ printf("进入男子组决赛"); }else{ printf("进入女子组决赛"); } }else{ printf("没有进入决赛,继续努力!"); } return 0; }
选择结构-switch
switch(表达式) {case 数值1: break; … default: break;}
#include <stdio.h> int main(){ int day = 4; switch(day){ case 1: printf("星期一吃青菜 "); break; case 2: printf("星期二吃鱼 "); break; case 3: printf("星期三吃肉 "); break; case 4: printf("星期四吃面条 "); break; default: printf("平时只能喝汤 "); break; } return 0; }
注意:每个case后面是否有break
循环结构-while
- while(表达式) { }
-
continue:用于跳过本次循环体剩余语句,进入下一次循环的条件判断,continue只是跳过当前的循环体,并没有跳出整个循环。
-
break的使用:某次的时候停止循环。
循环结构-do while
一定会执行一次循环体
while 和 do while 比较
inti=0; while(i<0){ i++; } // i = 0 inti=0; do{ i++; }while(i<0); // i = 1
循环结构-for
for(参数初始化;条件判断;参数更新){ //循环操作 }
for(;;) 这个是个死循环
for括号内的三个语句都是表达式,执行次序如下:
- 运行表达式1(参数初始化)
- 运行表达式2(条件判断),判断是否为真,若为真执行循环操作,若为假则结束循环
- 运行表达式3(参数更新),更新参数,进入步骤2执行下一轮循环
查看一个整数的二进制可用如下函数:
// 输出整数的二进制形式 void putBinary(int n) { int bits = sizeof(n) * 8; while (bits-->0) { printf("%d", n>>bits&1); if (bits%4==0) printf(" "); } printf(" "); }
1个字节等于8bit
- 可以连续使用2个long,也就是long long。一般来说,long long的范围是不小于long的,比如在32bit编译器环境下,long long占用8个字节,long占用4个字节。不过在64bit编译器环境下,long long跟long是一样的,都占用8个字节。
-
还有一点要明确的是:short int等价于short,long int等价于long,long long int等价于long long
signed 和 unsigned
1>首先要明确的:signed int等价于signed,unsigned int等价于unsigned
2> signed和unsigned的区别就是它们的最高位是否要当做符号位,并不会像short和long那样改变数据的长度,即所占的字节数。
-
signed:表示有符号,也就是说最高位要当做符号位,所以包括正数、负数和0。其实int的最高位本来就是符号位,已经包括了正负数和0了,因此signed和int是一样的,signed等价于signed int,也等价于int。signed的取值范围是-231 ~ 231 - 1
-
unsigned:表示无符号,也就是说最高位并不当做符号位,所以不包括负数。在64bit编译器环境下面,int占用4个字节(32bit),因此unsigned的取值范围是:0000 0000 0000 0000 0000 0000 0000 0000 ~ 1111 1111 1111 1111 1111 1111 1111 1111,也就是0 ~ 232 - 1
位运算
1、&按位与
1>功能: 只有对应的两个二进位均为1时,结果位才为1,否则为0。
2>举例: 比如9&5,其实就是1001&101=1,因此9&5=1
3>规律: 二进制中,与1相&就保持原位,与0相&就为0
2、|按位或
1>功能: 只要对应的二个二进位有一个为1时,结果位就为1,否则为0。
2>举例: 比如9|5,其实就是1001|101=1101,因此9|5=13
3、^按位异或
1>功能: 当对应的二进位相异(不相同)时,结果为1,否则为0。(二进制加法判断)
2>举例: 比如9^5,其实就是1001^101=1100,因此9^5=12
3>规律:
-
相同整数相^的结果是0。比如5^5=0
-
多个整数相^的结果跟顺序无关。比如5^6^7=5^7^6
-
因此得出结论:a^b^a = b
4、~ 取反
对整数a的各二进位进行取反,符号位也取反(0变1,1变0)
5、<< 左移
-
把整数a的各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2的n次方
-
由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃,左移出来的结果值可能会改变正负性
6、>> 右移
- 把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2的n次方
- 为正数时,符号位为0,最高位补0
-
为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定
运算符的优先级(从高到低)
优先级 |
描述 |
运算符 |
1 |
括号 |
()、[] |
2 |
正负号 |
+、- |
3 |
自增自减,非 |
++、--、! |
4 |
乘除,取余 |
*、/、% |
5 |
加减 |
+、- |
6 |
移位运算 |
<<、>>、>>> |
7 |
大小关系 |
>、>=、<、<= |
8 |
相等关系 |
==、!= |
9 |
按位与 |
& |
10 |
按位异或 |
^ |
11 |
按位或 |
| |
12 |
逻辑与 |
&& |
13 |
逻辑或 |
|| |
14 |
条件运算 |
?: |
15 |
赋值运算 |
=、+=、-=、*=、/=、%= |
16 |
位赋值运算 |
&=、|=、<<=、>>=、>>>= |
ASCII对照表