C语言4 DAY

关于++混合操作,不同编译结果推理

第一种编译结果:

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&0:0

  • 0&1:0

总结:如果我们前后两个操作数对齐位置上的二进制数字都是1,其结果是1,否则结果都是0

|:按位或

语法: a | b

说明:首先将参与计算的操作数转换为二级制,然后按照每一位进行对齐,处理结果如下:

  • 1|1:1

  • 1|0:1

  • 0|0:0

  • 0|1:1

总结:如果我们前后两个操作数对齐位置上的二进制数字只要有1,其结果是1,否则结果都是0

^:按位异或

语法: a ^ b

说明:首先将参与计算的操作数转换为二级制,然后按照每一位进行对齐,处理结果如下:

  • 1^1:0

  • 1^0:1

  • 0^0:0

  • 0^1:1

总结:不同为1,相同为0

<<:左移,按bit位往左偏移

  1. 无符号左移:

    语法: 操作数 << 移动位数(bit位)

unsigned int a = 3 << 3; // 快速计算:3 * 2^3`
​
`printf("%d\n",a); // 24

  1. 有符号左移: 语法: 操作数 << 移动位数(bit位)

int a = -3 << 3; // 快速计算:-3 * 2^3`
​
`printf("%d\n",a);// -24

>>:右移,按bit位往右偏移

  1. 无符号右移: 语法: 操作数 >> 移动位数(bit位)

unsigned char a = 3 >> 3;`
​
`printf("%d\n",a); // 0

  1. 有符号右移: 语法: 操作数 >> 移动位数(bit位)

int a = -3 >> 3;`
​
`printf("%d\n",a);// -1

案例:

注意

  1. 在进行移位运算的时候,凡是被移出去的位统统丢弃,凡是空出来的位统统补0。移位运算针对的是无符号整数.

  1. 如果非要进行有符号的移位运算,那么左移的时候,空出来的补0,右移的时候,空出来的补符号位(原码阶段)

其他运算符

赋值运算符

包含: = ,由 右 -> 左,优先级排倒数第二。

int a = 4;`
​
`int num = 5 +6;

注意:赋值运算符的左边(左操作数)必须是可写的地址。

复合赋值运算符

包含: += -= *= /= %= ,由 右 -> 左,优先级倒数第二。

int i = 1;`
​
`i+=1; // 等价于 i = i+1`
​
`i*=5; // 等价于 i = i * 5`

三目运算符

语法: 表达式1?表达式2:表达式3 ,其实就是if..else..简化版

求值顺序:

  • 如果表达式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. 使用三目运算符比较三个任意整型数的最大值?

#include <stdio.h>
​
int main() {
​
​
​
•    int a = 10;
•    int b = 20;
•    int c = 30;
int max = (a > b ? a : b) > c ? (a > b ? a : b) : c;
​
printf("最大值为: %d\n", max);
return 0;
}
//在上述代码中,首先使用三目运算符比较`a`和`b`的大小,如果`a`大于`b`,则将`a`赋值给变量`max`,否则将`b`赋值给`max`。然后,再使用三目运算符比较`max`和`c`的大小,如果`max`大于`c`,则将`max`的值作为最终结果,否则将`c`的值作为最终结果。

sizeof(int)

说明:用来计算某种类型或者变量所占的字节数。(中文英文字符集问题,不标准)

逗号运算符(,)

说明:优先级最低,左->右,由多个运算符将多个不同的式子连接起来的表达式称之为逗号表达式

语法:

(表达式1,表达式2...表达式n);

求值顺序:先求表达式1,再求表达式2,以此类推,整个逗号表达式的值为表达式n的值。

注意:

  1. 逗号表达式的优先级最低

  1. 运算顺序从左往右

  1. 整个逗号表达式的值取决于最右边的表达式的值

举例:

int a = 5,b = 3;
int ret = (a>b,a++,b++,a);// 这种写法其实就是为了减少代码量
printf("ret:%d\n",ret);

优先级的顺序

C语言程序设计结构

C语言设计的核心(灵魂)

程序 = 数据结构 + 算法

算法:对于问题解决的方法思路或者步骤

算法的特征:

  • 有穷性:问题需要在有限的步骤内完成

  • 可行性:解决步骤和方法思路必须要切实可行

  • 确定性:每一个代码指令要有明确的功能含义

算法的描述:流程图

流程图符号:

C语言程序设计的设计结构

三大结构:顺序结构、分支(选择)结构、循环结构

顺序结构

说明:各操作是按先后顺序执行的。是最简单的一种基本结构。这个也是默认的结构。

流程图:

选择结构

说明:又被称之为分支结构,根据条件是否成立,选择对应的操作。

流程图:

循环结构

说明:又被称之为重复结构

  • 当型循环

    特点:先判断条件,后执行语句,语句可能一次也得不到执行
    流程图:

  • 直到型循环

    特点:先执行语句,后判断条件,语句至少执行一次

C语言的语句

  1. 分类

  • 控制语句:while.. for.. if..else... ...

  • 函数调用语句:scanf(...);

  • 表达式语句:b=3;

  • 空语句:;

  • 复合语句:{...}

2.关注:输入输出语句(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

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值