嵌入式学习day3
一、表达式和运算符
格式: 表达式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,否则返回0 | a>b |
>=大于等于 | 如果成立返回1,否则返回0 | a>=b |
<小于 | 如果成立返回1,否则返回0 | a<b |
<=小于等于 | 如果成立返回1,否则返回0 | a<=b |
==等等 | 如果成立返回1,否则返回0 | a==b |
!=不等 | 如果成立返回1,否则返回0 | a!=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>在计算字节时,可以计算常量,变量,数据类型
- 计算变量
int a;
printf(“%ld”,sizeof(a)); - 直接计算数据类型的大小
printf(“%ld”,sizeof(int)); - 计算常量的字节大小,整数默认是4字节,小数默认是8字节
printf(“%ld”,sizeof(3));
二、三大控制结构
- 顺序结构:自上而下的运行结构
- 选择结构:根据不同选择实现的分支结构
- 循环结构:解决重复执行的过程
2.1 选择结构
2.1.1 单分支选择结构
解释:有一个选择
格式: if(表达式)
{
代码块;
}
解析:
1> if函数,如果
2> (): 不可以省略
3> if()的后面不可以加分号
4> 表达式:可以是任意表达式【算数、关系、条件、逻辑、逗号,位等表达式】
一般选用算数、关系、逻辑
5> {}: 当代码块只有一句时,大括号可省略
1> 计算偶数
if(a%2==0)
{
printf("偶数");
}
2> 输入一个判断被3整除,但不能被5、7整除的偶数
%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;
}