2024.7.25 第九天笔记
关于++混合操作,不同计算结果推理
第一种编译结果:
int i = 5;
int sum = (++i) + (++i)
= 6 + 7
= 13
第二种编译结果:
int i = 5;
int sum = (++i) + (++i)
= 6 + 7
= 7 + 7 前面的7是因为后面i的变化被影响后,重新赋值
= 14
第一种编译结果:
int i = 5;
int sum = (++i)+(i++)
= 6 + 6
= 12
第二种编译结果:
int i = 5;
int sum = (++i)+(i++)
= 6 + 6
= 7 + 6 前面的7是因为后面i的变化被影响后,重新赋值
= 13
注意:
算数运算符,运算结果是数值类型
关系运算符,运算结果是boolean类型(其实就是int的 0-假,非0-真)
逻辑运算符,运算结果是boolean类型(其实就是int的 0-假,非0-真)
运算符
位运算符
说明:按位(bit)来进行运算操作的运算符。
语法:~ & | ^ << >>
~:按位取反
说明:单目运算符,数据的每一个bit位取反,也就是二进制数位上的1变0,0变1。
举例:
unsigned char ret = ~0x05;// 0000 0101 -->1111 1010
printf("%d\n",~5); // -6
&:按位与
语法:a & b
说明:首先将参与计算的操作数转换为二进制,然后按照每一位进行对齐,处理结果如下:
1&1:1
1&0:0
0&1:0
0&0:0
总结:如果我们前面两个操作数对其位置上的二进制数字都是1,其结果都是1,否则结果都是0
|:按位或
语法:a | b
说明:首先将参与计算的操作数转换为二进制,然后按照每一位进行对齐,处理结果如下:
1|1:1
1|0:1
0|1:0
0|0:1
总结:如果我们前面两个操作数对其位置上的二进制数字只要有1,其结果是1,否则结果都是0
^:按位异或
语法:a ^ b
说明:首先将参与计算的操作数转换为二进制,然后按照每一位进行对齐,处理结果如下:
1^1:0
1^0:1
0^1:1
0^0:0
总结:不同为1,相同为0
<<:左移,按bit位左偏移
1.无符号左移:
语法:操作数 << 移动位数(bit位)
unsigned int a = 3 << 3;// 快速计算:3 * 2^3
printf("%d\n",a); //24
2.有符号左移:
语法:`操作数 << 移动位数(bit位)
int a = -3 << 3; // 快速计算:-3 * 2^3
printf("%d\n"a); //-24
>>:右移,按bit位左偏移
1.无符号右移:
语法:操作数 >> 移动位数(bit位)
unsigned int a = 3 >> 3;
printf("%d\n",a); //0
2.有符号右移:
语法:`操作数 >> 移动位数(bit位)
int a = -3 >> 3;
printf("%d\n"a); //-1
#include <stdio.h>
int main()
{
//位运算符
//按位与& 操作数转换为二进制,相同位上,都是1,结果是1,如果是非1,结果是0
printf("%d\n",3 & 5);
//按位或| 操作数转换为二进制,相同位上,只要有1,结果是1,否则,结果就是0
printf("%d\n",5 | 3);
//按位异或^ 操作数转换为二进制,相同位上,如果都是0或者1,结果0,否则,结果就是1
printf("%d\n",5 ^ 3);
//左移 操作数据转换为二进制,整体向左移动n位
unsigned int b1 = 3 << 3;
printf("%d\n",b1);//无符号左移
int b2 = -3 << 3;
printf("%d\n",b2);//有符号左移
//右移 操作数据转换为二进制,整体向右移动n位
unsigned int a1 = 3 >> 3;
printf("%d\n",a1);//无符号右移
int a2 = -3 >> 3;
printf("%d\n",a2);//有符号右移
printf("%d\n",~5);
return 0;
}
/*******************************************
1
7
6
24
-24
0
-1
-6
********************************************/
注意
1.在进行移位运算的时候,凡是被移除去的位统统丢弃,凡是空出来的位统统补0。移位运算针对的是无符号整数
2.如果非要进行有符号的移位运算,那么左移的时候,空出来的补0,右移的时候,空出来的补符号位(原码阶段)
1000 0000
1111 1000
其他运算符
赋值运算符
包含:=
,由右->左,优先级排倒数第二。
int a = 4;
int num = 5 + 6;
注意:赋值运算符的左边(左操作数)必须是可写的地址。
复合赋值运算符
包含:+= -+ *= /= %=
,由右->左,优先级倒数第二。
int i = 1;
i+=1; //等价于 i = i+1
i*=5; //等价于i = i*5
三目运算符
语法:表达式1?表达式2:表达式3
求值顺序:
-
如果表达式1的值为真1,则整个条件运算表达式的值为表达式2的值;
-
如果表达式1的值为假0,则整个条件运算表达式的值为表达式3的值;
// 案例1
// 需求:根据考试成绩进行奖励和乘法
// score >= 90 奖励外星人电脑一台
// score < 90 奖励刷锅刷碗1个月
int score = 89;
printf("%s",score >= 90 ? "奖励外星人电脑一台":"奖励刷锅刷碗1个月"); // 奖励刷锅刷碗1个月
// 案例2
int a = 10,b = 20;
int ret = a>b?++a:++b;
printf("ret:%d a:%d b:%d",ret,a,b);// ret=21,a=10,b=21
练习
1.使用三目运算符比较三个任意整数类型的最大值?
sizeof(int)
说明:用来计算某种类型或者变量所占的字节数。(中文英文字符集问题,不标准)
逗号运算符(,)
说明:优先级最低,左->右,有多个运算符将多个不同的式子连接起来的表达式称之为逗号表达式
语法:
(表达式1,表达式2,...,表达式n);
求值顺序:先求表达式1,再求表达式2,以此类推,整个逗号表达式的值为表达式n的值。
注意:
1.逗号表达式的优先级最低
2.运算顺序从左往右
3.逗号表达式的取值取决于最右边的表达式的值
举例:
int a = 5,b = 3;
int ret = (a>b,a++,b++,a);// 这种写法其实就是为了减少代码量
printf("ret:%d",ret);
优先级的顺序
C语言程序设计结构
C语言设计的核心(灵魂)
程序 = 数据结构 + 算法
数据结构:对数据的描述
算法:对于问题解决的方法思路或者步骤
算法的特征:
-
有穷性:问题需要在有限的步骤内完成
-
可行性:解决步骤和方法思路必须要切实可行
-
确定性:每一个代码指令要有明确的功能含义
算法的描述:流程图
流程图符号:
C语言程序设计结构
三大结构:顺序结构、选择(分支)结构、循环结构
顺序结构
说明:各操作是按先后顺序执行的。最简单的一种基本结构。这个也是默认的结构。
流程图:
选择结构
说明:又被称之为分支结构,根据条件是否成立,选择对应的操作。
流程图:
循环结构
说明:又被称之为重复结构
当型结构
特点:先判断条件,后执行语句,语句可能一次也得不到执行
直到型循环
特点:先执行语句,后判断条件,语句至少执行一次
C语言的语句
-
分类
-
控制语句:while... for... if...else...
-
函数调用语句:scanf(...);
-
表达式语句:b = 3;
-
空语句:;
-
复合语句:{...}
-
-
关注:输入输出语句(printf()/scanf())
输入输出缓存机制
概念
缓冲区又称缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入 或者输出的数据,这部分预留的空间叫做缓冲区。
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
为什么要有缓存区
1)减少IO设备的操作
2)提高计算机的运行速度。
比如:我们从磁盘里读取信息,先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就减少磁盘的读写次数,再加上计算
机对缓冲区的操作大大快于磁盘的操作,故应用缓冲区可大大提高计算机的运行速度
缓存区的类型
全缓冲:当填满缓冲区之后,才会进行实际IO操作。 比如 对磁盘文件的读写。 ---window 全缓冲大小4096字节 linux 全缓冲大小 1024字节
行缓冲:当在输入和输出中遇到换行符时,执行真正的IO操作,也就是冲刷缓冲区的数据。比如键盘输入数据
不带缓存:也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。
引发缓存区的刷新
1.遇到换行符\n
2.缓冲区满(溢出)
3.执行fflush(stdout),手动刷新缓存区
原理实现
说明:
录入:输入输出操作的内部采用的缓存机制,也就是当我们用scanf()输入数据时,并不是直接将键盘录入的数据存储到内存变量中,而是系统会先去输入缓冲区查看是否有符合类型的数据,如果存在将直接输入缓冲区中的数据到内存变量,此时就不用键盘录入,否则才需要键盘录入复合类型的数据。
输出:相同道理,当我们使用printf()输出数据时,也并不是直接将内存变量存储的数据输出到输出设备,而是先存储到输出缓冲区,当输出缓冲区被充满,或输出缓冲区中出现换行符,或者执行fflush(),才会将输出缓冲区的数据输出到标准输出设备。(打印机也是,我们测试用的是控制台显示终端)
案例:6818开发板图像绘制
需求:将一张BMP图片显示到开发板的LCD屏幕上
说明:
-
屏幕显示:BGR
-
图片显示:RGB
实现:RGB --> BGR
-
B:右移0个字节,也就是移动0位 B >> 0
-
R:右移2个字节,也就是移动16位 R >> 16
-
G:右移1个字节,也就是移动8位 G >> 8
以上就是第九天的学习笔记,有什么问题还请指正,谢谢!
标签:int,嵌入式,运算符,++,printf,缓冲区,C语言,表达式 From: https://blog.csdn.net/weixin_64313142/article/details/140698178