嵌入式学习day3

本文详细介绍了C语言中的表达式和运算符,包括算术运算、逻辑运算、关系运算、赋值运算、条件运算、位运算和逗号运算,以及它们的优先级。此外,还讲解了选择结构(单分支、双分支、多分支和switch结构)的基本用法。最后,提供了相关编程作业以巩固学习内容。
摘要由CSDN通过智能技术生成

一、表达式和运算符

格式: 表达式1 运算符 表达式2
如: 1+2 a+b (a+b)+3
表达式:常量 、变量、表达式
运算符种类:算数运算、逻辑运算、关系运算,条件运算,赋值运算,位运算,逗号运算

1.1 算数运算

符号描述解释
+加法运算当+号两端表达式是整数,最终结果一定是整数当+号两端有一个小数,最终结果就是小数
-减法运算当-号两端表达式是整数,最终结果一定是整数当-号两端有一个小数,最终结果就是小数
*乘法运算当*号两端表达式是整数,最终结果一定是整数当*号两端有一个小数,最终结果就是小数
/除法运算当/号两端表达式是整数,最终结果一定是整数,例如5/2=2当/号两端有一个小数,最终结果就是小数
%模、取余两端必须是整数
a++自加1,不可以对常量自增先运算后自增先将a进行运算,然后再自增
++a自加1先自增后运算先对a进行自增,然后再运算
a- -自减1先运算后自减先对a进行运算,然后再自减
–a自减1先自减后运算先对a进行自减,然后再运算

代码实例如下:

//++a
#include<stdio.h>
void main( )
{
     int i=10,a;
    a=++i;  //先自增后赋值
    printf(“a=%d\n”,a);  11
    printf(“i=%d\n”,i);11
}
//a++
#include<stdio.h>
void main( )
{
     int i=10,a;
    a=i++;   //先赋值再自增
    printf(“a=%d\n”,a); 10
    printf(“i=%d\n”,i); 11
}
//--a
#include<stdio.h>
void main( )
{
     int i=10,a;
    a=--i;  //先自减,后赋值
    printf(“a=%d\n”,a);9
    printf(“i=%d\n”,i);9
}
//a--
#include<stdio.h>
void main( )
{
     int i=10,a;    i--   i=i-1
    a=i--;   //先赋值后自减
    printf(“a=%d\n”,a); 10
    printf(“i=%d\n”,i);9
}

//例题
int a = 10, b = 20, c = 30, d = 40;
int a1 = ++a, b1 = b++, c1 = --c,  d1 = d--;   

printf("a=%d, a1=%d\n", a, a1); 11  11
printf("b=%d, b1=%d\n", b, b1);21  20
printf("c=%d, c1=%d\n", c, c1); 29  29
printf("d=%d, d1=%d\n", d, d1);39  40

//例题
int a,b,c;     //定义变量
a=b=c=0; //赋值
 a=++b + ++c;  //计算
 printf(“\n%d,%d,%d”,a,b,c);  a=2 b=1 c=1
 a=b++  + c++;  //计算  1 1
 printf(“\n%d,%d,%d”,a,b,c);  a=2 b=2 c=2
 a=++b + c++;  //计算  3 2
 printf(“\n%d,%d,%d”,a,b,c);  a=5 b=3 c=3
 a=b-- + --c;    //计算 3 2
 printf(“\n%d,%d,%d”,a,b,c);  a=5 b=2 c=2

1.2 逻辑运算

格式:表达式1 && 表达式2 表达式1 || 表达式2 !表达式
注意优先级:! > && > ||
0表示假,非0表示真

符号运算解释
&&逻辑与1&&0=0 1&&1=1 0&&1=0 0&&0=0遇假则假,全真为真,当第一个表达式结果为假,表达式2不执行,称为短路现象。
|| 逻辑或1 || 1=1 1 || 0 =1 0 || 1=1 0 || 0 =0遇真则真,全假为假,当表达式1结果为真,表达式2不执行,称为短路现象。
!逻辑非!1= 0!0= 1非真即假,非假即真

1.3 关系运算

作用:比较大小

符号运算解释
>大于如果成立返回1,否则返回0a>b
>=大于等于如果成立返回1,否则返回0a>=b
<小于如果成立返回1,否则返回0a<b
<=小于等于如果成立返回1,否则返回0a<=b
==等等如果成立返回1,否则返回0a==b
!=不等如果成立返回1,否则返回0a!=b
[10-100]
a>=10 &&a<=100
 小于10 或  大于100
a<10 || a>100
判断小写: a>='a' && a<='z'
判断大写:a>='A' && a<='Z'
判断单字符数字:a>='0' && a<='9'   / a>=48 && a<=57
判断特殊字符: 
!((a>='a'&&a<='z') || (a>='A' && a<='Z') || (a>='0' && a<='9'))
(!(a>='a'&&a<='z') && !(a>='A' && a<='Z') && !(a>='0' && a<='9') )

1.4 赋值运算

符号运算
=a=10,把10的值赋值给a
+=a+=2 ===>a=a+2
a+=3+5 ====>a=a+(3+5)
-=a-=2 ===>a=a-2
a-=3+5 ====>a=a-(3+5)
*=a*=2 ===>a=a2
a
=3+5 ====>a=a*(3+5)
/=a/=2 ===>a=a/2
a/=3+5 ====>a=a/(3+5)
%=a%=2 ===>a=a%2
a%=3+5 ====>a=a%(3+5)

1.5 条件运算/三目运算

格式:表达式1 ?表达式2 : 表达式3
表达式1:表示条件
表达式2:当表达式1成立,则执行表达式2
表达式3:当表达式1不成立,则执行表达式3

例题:

1> 判断a是否是偶数,是输出偶数,否则输出奇数
    a%2 == 0?printf("是偶数"):printf("是奇数");
    a%2 == !0?printf("是奇数"):printf("是偶数");

2> 输入一个年份,判断闰年
    闰年:被4整除,不能被100整除,或者被400整除
  year%4==0 && year%100!=0 || year%400==0?printf("闰年"):printf("平年")

3> 判断一个数是否是水仙花
    水仙花:三位数、各个位数字的三次方之和等于本身
    例如:153=1*1*1+5*5*5+3*3*3  是水仙花
        int num;
    printf("请输入一个数:");
    scanf("%d",&num);
    int g=num%10;
    int s=num/10%10;
    int b=num/100%10;
num>=100 && num<=999 && g*g*g+s*s*s+b*b*b==num?printf("水仙花\n"):printf("不是水仙花\n");
num>=100&&num<=999?g*g*g+s*s*s+b*b*b==num?printf("是水仙\n"):printf("不是水仙花\n"):printf("不是三位数");

1.6 逗号运算

格式:(表达式1,表达式2,表达式3…)
1>表达式个数是任意的
2>最终结果是最后一个表达式的结果
3>前面每一个表达式都执行

int a=3,b=4;
int c=(a+1,a--,++b,a+b);  //c=7
//逗号运算的每一个表达式都是独立的,执行完以后,再继续执行
//例如a--,需要减完1后,在向下继续

1.7 位运算

主要是对整形和字符型数据实现位运算

符号解释
&按位与:有一个0结果就是0,全1为13&2=2
|按位或:有一个1结果就是1,全0为0
^按位异或:相同为0,不同为1
~按位取反:0变1,1变0
>>按位右移:右移移位等价除以2右边舍去
若最高位是1,则补1,否则补0
无符号数最高位补0
<<按位左移:左移一位等价乘以2左边多余位舍去,右边补0
int main(int argc, const char *argv[])
{
/*
    int a=3,b=4;
    int c=(a+1,a--,++b,a+b);
    printf("%d",b>>2);
    printf("c=%d",c);
*/

    char a=3&2;
    printf("a=%d\n",a);
/*
    0000 0011
&    0000 0010
    ------------
    0000 0010
*/

    char b=-3&2;
    printf("b=%d\n",b);
/*
    1000 0011  原码
    1111 1100  反码

    1111 1101   补码
&    0000 0010
    ------------
    0000 0000
*/
    char c=3|2;
    printf("c=%d\n",c);
/*
    0000 0011
|    0000 0010
    ------------
    0000 0011
*/
    char d=-3|2;
    printf("d=%d\n",d);
/*
    1000 0011  原码
    1111 1100  反码

    1111 1101   补码
|    0000 0010
    ------------
    1111 1111  补码
    1111 1110   反码
    1000 0001   原码

*/
    char e=3^2;
    printf("e=%d\n",e);
/*
    0000 0011
^    0000 0010
    ------------
    0000 0001
*/
    char f=-3^2;
    printf("f=%d\n",f);
/*
    1000 0011  原码
    1111 1100  反码

    1111 1101   补码
^    0000 0010
    ------------
    1111 1111  补码
    1111 1110   反码
    1000 0001   原码

*/
    
    char g=~2;
    printf("g=%d\n",g);
/*
 *0000 0010
  1111 1101   补码
  1111 1100   反码
  1000 0011   原码  -3
 */
    char h=~-3;
    printf("h=%d\n",h);
/*
 *
 *
 */

    char j=4>>2;
    printf("j=%d\n",j);
/*
 *00000100
 *  00000100    
 *00000001
 */
    char k=-4>>2;
    printf("k=%d\n",k);
/*
 *10000100  原码
 *11111011  反码
 *11111100  补码
    11111100
  11111111  右移的补码的二进制
  11111110   反码
  10000001  原码
 */
    
    char m=4<<2;
    printf("m=%d\n",m);
/*
 *00000100 
00000100
  00010000 
 *
 */
    char n=-4<<2;
    printf("n=%d\n",n);
/*
 *10000100  原码
 *11111011  反码
 *11111100  补码
11111100
  11110000  左移后的补码
  11101111  反码
  10010000  原码
  -16
 */

    return 0;
}

1.7 算数的优先级

重点:单 算 移 关 与 异 或 逻 条 赋

1.8 sizeof运算符

格式: unsigned sizeof(数据类型/变量名)
1> unsigned: 返回类型是unsigned.格式控制符是%ld
2> sizeof是一个关键字,不是函数
3>在计算字节时,可以计算常量,变量,数据类型

  1. 计算变量
    int a;
    printf(“%ld”,sizeof(a));
  2. 直接计算数据类型的大小
    printf(“%ld”,sizeof(int));
  3. 计算常量的字节大小,整数默认是4字节,小数默认是8字节
    printf(“%ld”,sizeof(3));

二、三大控制结构

  1. 顺序结构:自上而下的运行结构
  2. 选择结构:根据不同选择实现的分支结构
  3. 循环结构:解决重复执行的过程

2.1 选择结构

2.1.1 单分支选择结构

解释:有一个选择

格式: if(表达式)
       {
              代码块;     
       }
解析:
1> if函数,如果
2> (): 不可以省略
3> if()的后面不可以加分号
4> 表达式:可以是任意表达式【算数、关系、条件、逻辑、逗号,位等表达式】
    一般选用算数、关系、逻辑
5> {}: 当代码块只有一句时,大括号可省略

1>  计算偶数
    if(a%2==0)
    {
        printf("偶数");    
    }
2> 输入一个判断被3整除,但不能被57整除的偶数
         %3==0&& %5!=0  &&%7!=0 && %2==0
int main(int argc, const char *argv[])
{
    int num;
    printf("请输入一个数:");
    scanf("%d",&num);
    if(num%3==0 && num%5!=0 && num%7!=0 && num%2==0)
     printf("num=%d\n",num);
    return 0;
}
3> 输入两个数,按照升序输出,默认a为最小值,b为最大值
    int main()
    {
     int a,b;
     printf("请输入两个数\n");
     scanf("%d %d",&a,&b);
     if(a>b)
      	printf("升序为%d %d",b,a);
     printf("升序为%d %d",a,b);
     return 0;
    }

2.1.2 双分支选择结构

解释:有2个选择分支

格式:  if(表达式)
        {
            代码块1;        
        }
        else
        {
            代码块2;        
        }
解析:
1> else不可以单独使用
2> if()后面不可以加分号
3> 表达式:可以是任意表达式【算数、关系、条件、逻辑、逗号,位等表达式】
    一般选用算数、关系、逻辑
4> {}: 当代码块只有一句时,大括号可省略
5> 执行过程:当表达式成立则执行代码块1,否则执行代码块2
6> if...else之间不可以已添加语句,例如
    if(a%2==0)
     {printf("偶数");}   
    a+=1;    //错误
    else
       {printf("奇数");} 
1> 判断闰年
    if(a%4==0 && a%100!=0 ||a%400==0)
        printf("闰年\n");    
    else
        printf("平年\n");    
2> 输入三个数,输出最大值
  int a,b,c;
    printf("输入a,b,c的值:");
    scanf("%d %d %d",&a,&b,&c);
    if(a>b && a>c)
    printf("最大值%d",a);
    else
    b>c?printf("最大值%d",b):printf("最大值%d",c);

2.1.3 多分选择结构

解释:有2个以上的选择

格式: 
if(表达式1)
{ 代码块1   }
else if(表达式2)
{ 代码块2   }
else if(表达式3)
.....
else
{代码块n}
解析:
1> if()后面不可以加分号
2> 表达式:可以是任意表达式【算数、关系、条件、逻辑、逗号,位等表达式】
    一般选用算数、关系、逻辑
3> {}: 当代码块只有一句时,大括号可省略 
4> else if的个数任意
5>最后一个else可有可无
6> 当表达式1成立执行代码块1,否则判断表达式2,成立执行代码块2,
否则判断表达式3,一次类推,当以上条件均不成则执行else

if else if 解析图

1> 输入三个数,输出最大值
    if(a>b && a>c)
        max=a;
    else if(b>a && b>c)
        max=b;
    else if(c>a && c>b)
        max=c;
2>对学生的考试成绩分级评测,规则为: 成绩1-100之间合法
1、成绩>=90为等级A
2、成绩>=80为等级B
3、成绩>=70为等级C
4、成绩>=60为等级D
5、成绩<60为等级E
    int main(int argc, const char *argv[])
{

    double score;
    printf("请输入成绩:");
    scanf("%lf",&score);
    if(score <0 || score>100)

        printf("输入数据不合法\n");
    else if(score>=90&& score<=100)
        printf("A");
    else if(score>=80)
        printf("B");
    else if(score>=70)
        printf("C");
    else if(score>=60)
        printf("D");
    else 
        printf("E");
    return 0;
}

2.1.4 switch选择结构

switch相较于else if,运行速度更快

switch(常量)
{
   case 常量表达式1:代码块1;break;
    case 常量表达式2:代码块2;break;
    case 常量表达式3:代码块3;break;
    .......
    case 常量表达式n:代码块n;break;
    default:代码块;break;
}
解析:
1>switch:选择,开关,作为判断
2switch的表达式:可以是任意的,但是最终结果必须是整形或单字符型
    float a=1.5
    switch(a>2)  正确
    
    switch(a)    错误
    
    char b;
    switch(b)    正确
3>switch的括号不可以省略
4>case: 例子,在使用时必须加空格
5>常量表达式:必须是整形或单字符型常量
    case 1  正确
    case 'a'  正确
    
    int a=3;
    case a:    a是变量,错误
    
    case 2>1&&3<5:  ===case 1:  正确
    
    int a=2;
    case a>1&&a<5:  错误
    
    case "a":   字符串,错误
    
    #deifne N 100
    case N:   N是常量,正确
6> break: 跳出switch,可有可无
7>case的位置可以任意的
8>default的位置可以任意的
9> case 后面的常量表达式不可以重复

输入不同的数,输出对应的星期值,1-7以外的值时提示错误。
如:输入1,输出星期一
    输入4,输出星期四
输入10,输出错误
    

三.作业

作业1:输入血型,根据血型判断性格

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
   作业1:输入血型,根据血型判断性格
   要求:输入A,a,都是A型,具有创造性、理智的性格。
   输入B,b,都是B型,具有积极性、实干家的性格。
   输入O,o,都是O型,具有善于交际、乐观的性格。
   输入X,x,都是AB型,具有冷酷、理智的性格。
   输入其他,显示,你是外星人吧。
   */
int main()
{
	char a;
	printf("请输入血型:\n");
	scanf("%c", &a);
	switch (a)
	{
	case 'a':
		printf("是A型血,具有创造性、理智的性格\n");
		break;
	case 'A':
		printf("是A型血,具有创造性、理智的性格\n");
		break;
	case 'b':
		printf("是B型血,具有积极性、实干家的性格\n");
		break;
	case 'B':
		printf("是B型血,具有积极性、实干家的性格\n");
		break;
	case 'o':
		printf("是O型血,具有善于交际、乐观的性格\n");
		break;
	case 'O':
		printf("是O型血,具有善于交际、乐观的性格\n");
		break;
	case 'x':
		printf("是AB型血,具有冷酷、理智的性格\n");
		break;
	case 'X':
		printf("是AB型血,具有冷酷、理智的性格\n");
		break;
	default:
		printf("你是外星人吧\n");
		break;
	}
	return 0;

}

作业2:解析以下代码

代码1

void main()
{
    int a=2;
   switch(a)
   {
    case 1:printf("good");
    case 2:printf("nice");   //此处输出“nice”
    default:printf("end");   //因为上句语句没有break,故此处也输出
   }
}

**答案: 输出结果为 “nice” “end”

代码2


int i = 8;
   switch (i % 2)
   {
   case 0: // i%2=0,执行此段代码
      switch (i % 2)
      {
      case 0:   // i%2=0,执行此段代码
         i++;   // i++ 得到i=i+1=9
         break; // 跳出此判断
      case 1:
         i--;
      };
   case 1:
      ++i; // 再执行此处代码,i=i+1=10
   }
   printf("%d", i);
   return 0;

答案为: i = 10

代码3


int a = 9, b = 8, c;
   c = (a == b || a > b) ? (++a - b) : (a + b--);
// c=(0 || 1)? (++a - b) : (a + b--)
// c=1? (++a - b) : (a + b--)   为真,执行第一个
// c=(++a - b)  ==>a=10,b=8,c=10-8=2
printf("a=%d b=%d c=%d\n",a,b,c);

答案为:a=10,b=8,c=2
//单 算 移 关 与 异 或 逻 条 赋*

代码4

int a = 0, b = 2, c ;
c = !a || ++b&&a--;   //!a =1 ,1 || 直接输出,不执行后面的运算
printf("c=%d\n",c);  //1
printf("a=%d\n",a); //0
printf("b=%d\n",b); //2

答案:a=0,b=2,c=1

代码5

int a=9,b=8,c;

c = ( a==b || a>b) ? (++a - b) :(a + b--);//c=(0 || 1)?(++a-b):(a+b--)
										// c=(++a-b) ⇒ a=10, b=8,c=2
printf(“a=%d\n”, a); 
printf(“b=%d\n”, b);
printf(“c=%d\n”, c);

答案:此题和代码3重复 a=10, b=8,c=2

代码6

      void main()
{
      int a=3,b=4,c;
      c=(a++>=b) ? (3+5>++a||b<=6 ) :(b-a>++a&&b<=6) ;
    /*c=(3>4==假)? (3+5>++a||b<=6 ) :(b-a>++a&&b<=6) ; 
     执行(b-a>++a&&b<=6) 	 此时a=4	 c=(b-a>++a&&b<=6)	
     										 c=(4-4>5&&b<=6)	
     										 c=(0&&b<=6)			
     										 c=0 ==>a=5 b=4,c=0
     										 */						
      printf("c=%d\n",c);
      printf("a=%d\n",a);
      printf("b=%d\n",b);
      }

答案:a=5 b=4,c=0

代码7

#include "stdio.h"
void main()
{
   int a = 3;
   a -= a *= a /= a += a + a++; // a=a-(a=a*(a=a/(a=a+(a+a++))   ==>此处a=a+(a+a++)  ==>a=a+(4+3)=9  ==> a=4+4+3==11
   printf("a=%d\n", a);
}

答案:a=0

作业3:输入字符,如果是大写则转换为小写,如果是小写则转换为大写,如果是数字,输出该数字的平方。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main(int argc, const char *argv[])
{
   char ch;
   printf("请输入字符,大小写字母,或者数字符号\n");
   scanf("%c", &ch);
   if (ch >= 'a' && ch <= 'z')
   {
      printf("%c\n", ch - 32);
   }
   else if (ch >= 'A' && ch <= 'Z')
   {
      printf("%c\n", ch + 32);
   }
   else if (ch >= '0' && ch <= '9')
   {
      printf("%d\n", (ch - 48) * (ch - 48));
   }
   else
      printf("你输入的字符不在范围内\n");
   return 0;
}

作业4:输入4个数,输出4个数的最大值

// C语言专用模板
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
   程序要求:输入4个数,输出4个数的最大值
*/

int main()
{
   int a, b, c, d, s;
   printf("请输入四个数,中间以空格隔开\n");
   scanf("%d %d %d %d", &a, &b, &c, &d);
   if (a >= b && a >= c && a >= d)
      s = a;
   else if (b >= a && b >= c && b >= d)
      s = b;
   else if (c >= a && c >= b && c >= d)
      s = c;
   else
      s = d;
   printf("最大的数是%d\n", s);
   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值