思维导图:
一、运算符
【3】赋值运算符
=:赋值运算符
左值 = 右值; 把右值赋值给左值
左值,是既可以作为左值也可以作为右值的量
右值,只能作为右值的量
混合赋值运算符:
a+=b | a=a+b |
a-=b | a=a-b |
a*=b | a=a*b |
a/=b | a=a/b |
【4】关系运算符
非真即假,非0即1
0假,1真
在C语言中非0即为真
== | 判断左右两个操作数是否相等 |
!= | 不等于 |
a>b | 判断a是否大于b |
a | 判断a是否小于b |
a>=b | 判断a是否大于等于b |
a | 判断a是否小于等于b |
if(表达式成立)
{
执行代码块的内容;
}
【5】逻辑运算符
逻辑运算的结果非0即1,非真即假
&& | 逻辑与,两个操作数都为真结果才是真, 有一个操作数为假结果就是假 |
|| | 逻辑或,两个操作数都为假结果才是假 一个操作数为真结果就是真 |
! | 逻辑非, |
逻辑短路现象
逻辑与运算,如果左侧表达式的值为假,右侧的表达式不会执行,逻辑与运算的结果为0/假
逻辑或运算,如果左侧表达式的值为真,右侧的表达式不会执行,逻辑与运算的结果为1/真
【6】条件运算符
C语言中的唯一一个三目运算符
表达式1?表达式2:表达式3
先执行表达式1,如果表达式1成立,执行表达式2,如果表达式1不成立,执行表达式3。
练习:
1、终端输入两个数,使用条件运算符,输出两个数中较大的数。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int num,num1;
scanf("%d %d",&num,&num1);
num>num1?printf("%d\n",num):printf("%d\n",num1);
return 0;
}
【7】逗号运算符
(表达式1,表达式2,表达式3·····表达式n)
每个表达式都会执行,取最右侧表达式的结果,
【8】位运算符
一般都使用无符号数进行位运算
对二进制进行运算的
& | 按位与,两个二进制位都为1结果为1 有一个为0结果就是0 |
| | 按位或,两个二进制位都是0结果位0 有一个位1结果就是1 |
^ | 按位异或,同0异1 |
~ | 按位取反,1变0,0变1 |
>> | 按位右移,高位补0 |
按位左移,低位补0 |
位运算常用于对数据的置位操作 重要!
0与任何数都是0,1与任何数都是数本身
1或任何数都是1,0或任何数都是数本身
0异或任何数都是数本身,1异或任何数都是取反
练习:
已知unsigned char data;写出把data的第三位置1的表达式;
把data的第四位置0的表达式,讲data的第六位按位取反的表达式。^
data|=(0x1<<3); data&=~(0x<<4); data^=(0x<<6);
#include <stdio.h> int main(int argc, const char *argv[]) { unsigned char data = 0x76; //0111 0110 //0111 0110 | 0000 1000 = 0x7E //0000 1000 = 0x<<3 //第三位置1:0111 1110 0x7E data|=(0x1<<3); printf("%#X\n",data); //0111 1110 & 1110 1111 = 0x6E //1110 1111 ~(0x1<<4) //第四位置0:0110 1110 0x6E data&=~(0x1<<4); printf("%#X\n",data); //两数异或,同0异1 //0异或任何数结果都是数本身, //1异或任何数都是对该位取反 //0110 1110 ^ 0100 0000 //0100 0000 = 0x1<<6; //第六位取反:0010 1110 0x2E data^=(0x1<<6); printf("%#X\n",data); return 0; }
【9】sizeof运算符
sizeof求数据的大小。
sizeof(数据); sizeof括号里面放什么,就求什么的大小。
#include <stdio.h>
int main(int argc, const char *argv[])
{
char c = '1';
printf("%ld\n",sizeof(int)); //4
printf("%ld\n",sizeof(short)); //2
printf("%ld\n",sizeof('a')); //4
printf("%ld\n",sizeof(char)); //1
printf("%ld\n",sizeof(c));
return 0;
}
sizeof的结果64为默认是无符号长整型
32位默认是无符号整形
【10】运算符优先级
单算移关于
异或逻条赋
加括号,括号的优先级最高
二、C语言的结构
- 顺序结构,代码从上到下执行
- 分支结构/选择结构
- 循环结构
一、分支结构
【1】if单分支结构
if(表达式)
{
表达式成立执行的代码块;
}
【2】双分支结构
if(表达式)
{
表达式成立执行的代码块;
}
else
{
表达式不成立执行的代码块;
}
【3】多分支结构
if(表达式1)
{
表达式1成立执行的代码块;
}
else if(表达式2)
{
表达式1不成立但是表达式2成立执行的代码块;
}
else if()
{
····
}
····
else
{
}
【4】嵌套if
if(表达式1)
{
if(表达式2)
{
表达式1成立并且表达式2成立执行的代码块;
}
else
{
表达式1成立但是表达式2不成立执行的代码块;
}
}
else if( ····)
·····
练习:
1.终端输入一个数,判断是否是偶数
2.终端输入一个数,判断是否是7的倍数
3.终端输入年份,判断是否是闰年,能被四整除但是不能被100整除或者能被400整除的叫闰年。
#include <stdio.h> int main(int argc, const char *argv[]) { int num; scanf("%d",&num); //判断是否是偶数 if(num%2==0) { printf("%d是二的倍数\n",num); } else { printf("%d不是二的倍数\n",num); } printf("请输入新的数\n"); scanf("%d",&num); if(!(num%7)) //!是一个单目运算符,优先级高于% { printf("%d是七的倍数\n",num); } else { printf("%d不是七的倍数\n",num); } printf("请输入年份\n"); scanf("%d",&num); if(num%4==0&&num%100!=0||num%400==0) { printf("%d年是闰年\n",num); } else { printf("%d是平年\n",num); } return 0; }
4.终端输入一个[100,999]之间的数,判断是否是是否是水仙花数
(水仙花数:个位*个位*个位+十位*十位*十位+百位*百位*百位=数本身)
#include <stdio.h> #include <math.h> int main(int argc, const char *argv[]) { int num,a,b,c; printf("请输入一个数\n"); scanf("%d",&num); a = num/100; b = num/10%10; c = num%10; //使用pow函数需要包含<math.h>头文件,gcc编译需要加上-lm参数 if(num==a*a*a+b*b*b+pow(c,3)) { printf("%d是一个水仙花数\n",num); } return 0; }
5.终端输入学生成绩,输出成绩等级,[100,90]A,(90,80]B,(80,70]C,(70,60]D,(60,0]不及格。
#include <stdio.h> int main(int argc, const char *argv[]) { int score; scanf("%d",&score); if(score<0||score>100) { printf("error\n"); } else if(score>=90&&score<=100) { printf("A\n"); } else if(score>=80&&score<90) { printf("B\n"); } return 0; }
6.狗的前两年每一年相当于人类的10.5岁,之后每增加一年就增加一岁,终端输入狗的年龄,输出该相当于人的多少岁。
#include <stdio.h> int main(int argc, const char *argv[]) { float age; scanf("%f",&age); if(age>2) //判断狗的年龄是否大于2,大于2时的计算逻辑 { age = 10.5*2+age-2; } else //小于等于2时的计算逻辑 { age = 10.5*age; } printf("%f\n",age); return 0; }
7.终端输入一个数,判断是否是3的倍数,如果是3的倍数再判断是否是5的倍数。
int main(int argc, const char *argv[]) { int num; scanf("%d",&num); if(num%3==0&&num!=0) { if(num%5==0) { printf("%d既是3的倍数也是5的倍数\n",num); } else { printf("%d是3的倍数但是不是5的倍数\n",num); } } return 0; }
作业:
1.整理思维导图
2.终端输入年份,判断是否是闰年,在闰年的基础上判断是否是超级闰年,能被400整除的是超级闰年
3.终端输入三条边,判断是否能构成三角形(判断两边之和大于第三边),在能构成三角形的基础上判断三角形的类型(等边,等腰和直角)
4.从终端输入一个字符:如果是大写的 转换成小写,如果是小写的 转换成大写,如果是 0-9 按照 %d 输出对应整型的 0-9,其他字符 转换成 #并输出。