一 输入、输出
1.1 输出函数
printf 函数是一个可变参数函数,参数的个数不定:int printf(const char *format, ...)
printf("%d\n", x);
printf("%d %d\n", x, y);
1.2 输入函数
1.2.1 scanf函数:int scanf(const char *format, ...)
scanf 函数从标准输入读取输入,并根据提供的 format 来浏览输入
1.2.2 getchar函数:int getchar(void)
int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数:
#include <stdio.h>
int main(){
//输入数值
int x = 2;
printf("please upload a number\n");
//scanf("%d:", &x);
printf("%d\n", x);
//输入字符,只能一次捕获一个字符
char y='d';
//scanf("%c\n", &y);
printf("y: %c\n", y);
//连续输入多个值
int a=2, b=8;
char c='l';
scanf("%d %d %c", &a, &b, &c);
printf("a:%d and b:%d and c:%c\n", a, b, c);
//getchar 继续输入字符
getchar(); //获取下一个可用字符
char d='k';
scanf("%c", &d);
printf("upload d data:%c", d);
return 0;
}
二 运算符和表达式
2.1 运算符和表达式的概念
1 运算符是一种告诉编译器执行 特定的数学或逻辑操作的符号,C 语言内置了丰富的运算符,并提供了以下类型的运算符:
2 表达式就是通过运算符将运算对象(操作数)连接起来的式子,就叫表达式。
a+b, x=a+2, x=y>z, x++
3、运算符也叫做 操作符,根据运算符操作的运算对象的个数可以将运算符分为以下几种
- 单目运算符:只需要一个操作数
- 双目运算符:需要两个操作数
- 三目运算符:需要三个操作数
4、运算符的优先级
- ! > 算术运算符 > 关系运算符 > && > || > 条件运算符 > 赋值运算符 > 逗号运算符
5、运算符的结合性
运算符的结合性运算符在执行表达式时运算符和左右操作数结合的顺序,运算符的结合性分为:
- 单目运算符:根据操作数在左还是右分为左结合和右结合
- 双/三目运算符:从左至右或者从右至左
2.2 算术运算符
1、C语言内置的算术运算符有如下几种:
2、注意: % 取模 (取余) 运算符的两个操作数 只能为整数
3、注意:前自增/前自减先计算后引用,后自增/后自减先引用后计算
2.3 赋值运算符
C语言内置赋值运算符有如下几种:
注意: “=”不是相等的意思,而是赋值
专业术语:数据对象、左值、右值
- 赋值表达式语句的目的是把值存储到内存上.用于存储值的数据存储区域统称为数据对象。
- “左值"(lvalue)指用于标识一个特定的数据对象的名字或表达式。
- 左值具有两个特性:
- 1. 可修改性,又称为可修改左值
- 2. 是数据对象的标识符,应具有标识符的特性
- 3. 左值不能为常量
- 注意:左值不能为常量
- 左值具有两个特性:
- "右值"(rvalue)指的是能赋给可修改的左值的量
×+100
y = 200
y = X
y = X+200
//从上面几个表达式我们可以看出:右值可以是常量可以是变量,也可以是任何可以产生一个值的表
//达式(当然任何表达式最终都有一个最终的值)
c + 1 = 10 //是错误的
2.4 关系运算符
关系运算符用于比较两个数值中间的关系,所以也叫做 比较运算符。
C语言内置了如下关系运算符:
注意:赋值运算符"="和关系运算符“==”的区别
2.5 逻辑运算符
2.5.1 逻辑运算符导入
- 我们回顾一下,在学习关系运算符的时候关系运算表达式的 结果只有0和1。为什么判断两个数值某个关系是否成立时要用0/1来表示呢?
- 计算机通过两个逻辑来表示两个数值之间的关系:
- 逻辑真(关系成立):非0
- 逻辑假(关系不成立):0
- 在调试程序时,C语言为了形象地表达某两个值之间的关系,就用计算机中最简单的两个值0和1来描述,什么意思呢?如果你在调试程序时输出结果为0,则表示你所判断的关系是不成立的,反之则表示成立!
- 注意:1 是“真”,但是“真”不是1,你学会了吗? ^_^
2.5.2 逻辑运算符的使用
1、在实际应用中,我们经常需要结合多个逻辑来判断某个条件是否成立。
2、在C语言中如果需要结合多个逻辑组成表达式,应该使用C语言内置的逻辑运算符:
3、判断学生的成绩是否为良好在C语言中应该使用如下表达式:
x>=60 && x<=70
4、情人节快到了,你问你女朋友∶亲爱的想要个什么礼物啊?你女朋友说给我买只口红吧或者买盒面膜也行?为了满足你女朋友的要求你该怎么做呢?
- 买口红 || 买面膜
5、如果你女朋友口红和面膜都要呢?
- 买口红 && 买面膜
2.6 位运算符
2.6.1 位运算的基本使用
1. 位运算是指按 二进制 进行的运算。
2. 计算机所有的计算最终都是通过二进制的位运算进行的!
3. 在软件开发过程中,常常需要处理二进制位的问题,例如:
- 通过单片机、STM32等控制灯光、风扇等
- 通过子网掩码求IP地址的网络号
- 通过异或对数据进行加密
- 通过位运算判断数据的奇偶性(x & 1)
4. C 语言 内置的位运算符 有:
2.6.2 位运算的“骚操作”
1. 左移 实现乘法
- 左移n位 等价于乘以2的n次方
int x;
x = 2;
x = x << 2;
x = x << 3
2. 右移 实现除法
- 右移n位等价于 除以2的n次方
int x = 100;
x = x >> 1;
x = x >> 3;
3. 不使用中间变量交换两个整型变量的值
int a = 5, b = 6;
a = a+b;
b = a-b;
a = a-b;
以上代码看似可以实现两个整型变量数值的交换,但是当a,b特别大的时候可能会超出范围。
int a = 5, b = 6;
a = a ^ b;
b = a ^ b;
a = a ^ b;
4. 判断整数的奇偶性
x & 1
5. 位操作进行 高低位交换
a = (a >> 8) | (a << 8);
6. 寄存器的置位
- 嵌入式系统总是要用户对变量或寄存器(8位)进行位操作。给定一个变量a,将a的第3个bit位置1(bit位最右边的位第0位),其他位的值不变。
a = a | 0x08
- 将第三个bit位清零,其他位的值保持不变
a = a & (~0x08)
7. 数据的“拆解”
- 在数据的传输过程中需要对整型数据进行拆解,例如 int x = 0x1m2345678, 我们需要将x分别拆解成0x12 0x34 0x56 0x78进行传输。
x & 0xFF
(x >> 8) & 0xFF
(x >> 16) & 0xFF
(x >> 24) & 0xFF
8. 数据的“组装”
- 假如我们拿到了被拆解后的数据分别为:0x12 0x34 0x56 0x78, 如果组装成0x12345678呢?
x = 0x12<<24 | 0x34<<16 | 0x56<<8 | 0x78
#include <iostream>
int main() {
//算术运算符,乘法计算结果
int x = 11;
float y = 3.0;
float z = x * y;
printf("view data z:%f\n", z);
//除法计算结果
int a =10, b=3;
float c = a/b; //整型数据相除为整型数据
float m = 3.0;
float d = a/m; //整型数据和浮点数相除为浮点数
printf("view data c:%f\n", c);
printf("view data d:%f\n", d);
//printf("10/0:%f\n", 10/0); //C语言中不容许除0的操作,会报错
//printf("10%3.3:%d\n", 10%3.3); //取模(取余操作)操作只能在整数和整数之间,不然会报错
//前自增运算符的使用
a = 2;
printf("view add front result, ++a:%d\n", ++a); //自己会增加
b = ++a;
printf("view add front result, a:%d, b:%d\n", a, b); //自己增加然后赋值操作
//后自增运算符的使用
a = 2;
//printf("view add front result, a++:%d\n", a++); //自己不会增加
b = a++;
printf("view add front result, a:%d, b:%d\n", a, b); //在原值基础上+1赋值
//算术运算符
a=2, b= 3+1;
printf("view a:%d and b: %d\n", a, b);
printf("view result a==b:%d\n", a==b); //0
printf("view result a!=b:%d\n", a!=b); //1
printf("view result a>b:%d\n", a>b); //0
printf("view result a<b:%d\n", a<b); //1
//逻辑运算符
a = 2;
printf("a:%d, logic %d\n", a, a>=4); //C语言不可以使用 1<=a<=5的形式
//逻辑非
printf("!a: %d\n", !a); //0
//逻辑与
printf("a&b: %d\n", a<=5 && b<=5); //1
//逻辑或, 一个为真就是真
printf("a||b: %d\n", a<=5 || b<=1); //1
//位运算符
char A = 60;
char B = 30;
// 与运算
printf("A & B: %d\n", A & B); //28
//或运算 00为0 , 11为0, 1+任意值为1
printf("A | B: %d\n", A | B); //62
//异或运算 ^, 相同为0, 不同为1
//0和任意值异或得任意值, 1和任意值异或得任意值取反
printf("B^A: %d\n", B ^ A); //34
//按位取反 ~
printf("~A:%d\n", ~A); //-61
return 0;
}
2.7 逗号运算符
1、逗号运算符将两个表达式连接起来
- 表达式1, 表达式2
2、逗号运算符的结合性是“从左至右”:先计算表达式1,后计算表达式2
a = 3;
b = a*2, a+4;
3、整个表达式最终的值是表达式2的值
2.8 条件运算符
1、条件运算符是通过问号"?"和冒号";"连接的表达式
- 表达式1 ? 表达式2 : 表达式3
2、执行逻辑
- 如果表达式1的结果为真,则整个表达式的结果为 表达式2的结果,否则为表达式3的结果
3、实例
- printf("%d\n", 3>4?3:4); //取最大值