嵌入式-C语言-3-类型转换/流程控制/循环结构

一、数据类型的转换

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);

   

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值