一、数据类型的转换
1.隐式转换
特点:如果表达式中不同数字的数据类型不同,gcc编译器先将不同的数据类型,转换成相同的数据类型之后再做运算
隐式转换的三种情况:
<1>.隐式转换过程中必须把内存小的类型转换成占内存大的类型
<2>.如果既有整形数据类型还有浮点数据类型,gcc编译器自动将整形数据类型转换成浮点类型
<3>.如果既有无符号数据类型还有有符号数据类型,gcc编译器自动将有符号转无符号数据类型
注意:隐式转换的致命缺陷代码的可读性很差
2.强制转换
强制转换语法格式:目标类型变量 = (目标类型)源类型变量;
例如:
char a = 90;
int b = (int)a; //gcc强制将a转换成int类型在赋值给变量b
注意:强制数据类型转换可能会造成数据的丢失
例如:
char a = (char)300; //数据丢失了
printf("a = %d\n", a); //a=44 = 300(太大了) - 128 = 172(太大了)-128=44 (回滚)
所以:强制转换都是小转大,或者相等转
切记:不管哪种类型转换都不会修改变量本身的值
例如:
int a = 555;
char b = (char)a;
printf("b = %d, a = %d\n"); //b = ? a = 555
二、C程序的流程控制
2.1分支结构:条件分支和开关分支
条件分支:语法格式:
形式1:语义:如果表达式1为真,那么就执行语句1
if (表达式1) {
语句1;
}
形式2: 语义:如果表达式1为真,那么运行语句1,否则运行语句2
if(表达式1) {
语句1;
}
else {
语句2;
}
形式3:语义:如果表达式1为真,那么执行语句1,如果表达式1不为真,那么执行表达式2,如果表达式2为真,那么执行语句2,如果表达式2不为真,依次向下判断
if(表达式1) {
语句1;
}
else if(表达式2) {
语句2;
}
...
else if(表达式N) {
语句N;
}
形式4:语义:如果表达式1为真,那么执行语句1,如果表达式1不为真,那么执行表达式2,如果表达式2为真,那么执行语句2,如果表达式2不为真,依次向下判断,如果上面都不成立,最后运行语句M
if(表达式1) {
语句1;
}
else if(表达式2) {
语句2;
}
...
else if(表达式N) {
语句N;
}
else {
语句M;
}
2.2条件分支使用注意事项
1.if和else的配对原则:else或者else if和最近的if配对
2.如果语句只有一条,{}是可以省略的(由衷建议加上)
if(1 == a) { if (1 == a)
printf("a等于1.\n"); 等价于-> printf("a等于1.\n");
}
3.{}是否独占一样问题:根据公司的编码规范来定
原则:只要是linux系统软件开发,{}不会独占一行
//linux程序员
if(1 == a) {
printf("a等于1.\n");
}
//公司编码规范
if(1 == a)
{
printf("a等于1.\n");
}
开关分支:语法格式:
switch(控制表达式) {
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
...
case 常量表达式N:
语句N;
break;
default:
语句M;
break;
}
执行过程:控制表达式的值和下面case对应的常量表达式的值一样(相等)
那么就会执行对应的语句,一旦遇到break,switch...case开关分支立刻结束
如果case都不相等,最后只能执行default对应的语句
开关分支结构使用注意事项
控制表达式被当成一个整数处理(int),可以是字符,但是不能是浮点数和字符串(例如:"abc")
例如:
switch(5) //可以
switch(5.5) //不可以
switch("abc") //不可以
switch('a') //可以
常量表达式必须是常量,例如:5,'A',2+5等,不允许有重复的分支case
int cmd = 250;
switch(cmd) {
case 250:
break;
case 250: //gcc编译器报错
break;
}
如果其中某个case对应的break没有添加,当这个case成立时,并且运行其语句之后会继续执行下一个case所以建议如果代码需要break,写完case单子之后,先写一个break出来,防止忘掉!
int cmd = 250;
switch(cmd) {
case 250:
printf("1.\n");
case 251:
printf("2\n");
break;
...
default:
break;
}
结果:打印1和2
default关键字可以写在任意case的前面,但是需要添加break,如果default关键字写在最后,break是可以省略的
分支case或者default中如果定义变量,记得加{},将来这个变量只能给对应的case使用!
例如:
int cmd = 250;
switch(cmd) {
case 250:
printf("1.\n");
case 251: {
char c = '2'; //定义字符变量
printf("%c\n", c);
break;
}
...
default:
break;
}
总结:if...else和switch..case对比:
1.switch...case能做的,if...else都能做
2.if...else能做的,switch...case不一定能做,比如处理浮点数或者字符串
3.switch...case某些场合极其繁琐
例如:判断0~1000的范围,如果用switch...case,必须添加1000条case
但是如果用if语句,一条拿下:if(xxx > 0 && xxx < 1000)
4.gcc编译器对switch...case生成的代码量要比if...else要少,所以switch代码执行效率高
三、程序三大结构之循环结构
3.1.循环结构功能:将一组语句重复多次执行
三种类型循环:for循环,while循环,do...while循环
3.2.for循环
a)语法格式:
for(表达式1; 表达式2; 表达式3) {
循环语句;
}
语义(执行流程):
第一步骤:首先计算,运行表达式1(只做一次)
第二步骤:然后计算,运行表达式2如果表达式2的结果为真,那么就执行运行循环语句如果表达式2的结果为假,那么for循环结束退出
第三步骤:如果如果表达式2的结果为真,那么就执行运行循环语句,并且当循环语句执行完,再接着计算,运行表达式3,表达式3运行完毕,重复第二步骤
b)for循环的使用形式:
形式1:(注意:这里i有对应的专业术语:循环变量)
int i;
for(i = 0; i < 5; i++) {
printf("i = %d\n", i);
}
形式2:
int i = 0;
for(; i < 5; i++) {
printf("i = %d\n", i);
}
形式3:
int i = 0;
for(; i < 5; ) {
printf("i = %d\n", i);
i++; //循环变量放在循环语句中
}
形式4:死循环(注意:按ctrl+c键退出程序)
for(;;) {
printf("hello,world\n");
}
int i = 0;
for(;;) {
printf("i = %d\n", i);
i++; //循环变量放在循环语句中
if(i >= 5) {
break; //中断,结束for循环,如果for循环是嵌套,只是中断最内层for循环
}
}
形式5:
int i, j;
for(i = 0, j = 0; i < 5 && j < 5; i++, j++) {
printf("i = %d, j = %d\n", i, j);
}
形式6:
for(int i = 0; i < 5; i++) {
printf("i = %d\n", i);
}
printf("i = %d\n", i); //gcc报错
注意:如果循环变量定义是在表达式1中完成,那么循环变量只能用于for循环for循环之外不可用
形式7:
int i;
for(i = 0; i < 5; i++) {
if(3 == i) {
continue;
//中断,结束本次循环,继续下一次循环
//当i=3时,执行continue关键字,
//后面的循环语句不再执行,直接去执行表达式3,i++
//然后重复下一次循环
}
printf("i = %d\n", i);
}
c)for循环语句中如果仅有一条语句,{}可以省略(建议不要这么干)
for(int i = 0; i < 5; i++)
printf("i = %d\n", i);
3.3.while循环
a)语法格式
while(循环控制表达式) {
循环语句;
}
语义,执行流程:
第一步骤:首先计算,运算循环控制表达式如果计算的结果为真,那么执行循环语句如果计算的结果为假,while循环直接结束
第二步骤:当循环语句执行完毕,继续执行运行第一步骤
例如:
int i = 0;
while(i < 5) {
printf("i = %d\n", i);
i++;
}
while死循环:
while(1) {
printf("hello,world\n");
}
b)注意:如果while的循环语句只有一条,{}可以不加(建议不要这么做)
int i = 0;
while(i++ < 5)
printf("i = %d\n", i);
3.4.do-while循环
a)语法格式
do {
循环语句;
}while(循环控制表达式); //切记此分号不可省略
语义:执行流程:
第一步骤:先执行循环语句; //第一次没有做判断
第二步骤:然后计算,运行循环表达式如果为真,继续执行循环语句,后续依次重复,如果为假,循环结束
特点:do-while至少执行一次!
例如:
int i = 0;
do {
printf("i = %d\n", i);
}while(i++ < 5);