c语言笔记3

2024.7.25

注意:算术运算结果是数值类型

关系运算结果是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);//000000101  11111010

&按位与:

语法: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

总结:不同为真,相同为假

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

1.无符号左移:

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

Unsigned int a = 3 << 3

Printf(“%d\n”,a);//24

2.有符号左移

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

int a = -3 << 3

Printf(“%d\n”,a);//-24

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

1.无符号右移:

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

Unsigned char a = 3 >> 3

Printf(“%d\n”,a);//

2.有符号右移

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

int a = -3 >>3

Printf(“%d\n”,a);//-

注意:

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

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

其他运算符: 

语法:=  +=  -=  *=  /=  %=

赋值运算符

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

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奖励家务

Int score = 89

Printf(“%d\n”,score >= 90 ? “奖励电脑”:”奖励家务”);

案例2

Int a=10,b=20;

Int ret = a>b?++a:++b;

Printf(“ret:%d a:%d b:%d”,ret,a,b);

练习

1.使用三目运算符比较三个任意整型数的最大值?

Sizeof(int)

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

逗号运算符(,)

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

语法:(表达式1,表达式2,……..,表达式n);

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

注意:

举例:

Int a = 5,b = 3;

Int ret = (a>b,a++,b++,a);为了减少代码

Printf(“ret:%d\n”,ret);

优先级顺序

C语言程序设计结构

C语言设计的核心

程序=数据结构+算法

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

算法的特征:

算法的描述:流程图

流程图符号:

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

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

顺序结构:

说明:个操作是按先后顺序执行的,是最简单的结构,也是默认的结构

分支(选择)结构

说明:根据是否满足给定条件是否成立,选择对应的操作。

双分支

单分支

 

循环结构:

说明:又称重复结构,在一定条件下,反复执行某一部分操作

当型循环

特点:先判断条件,后执行语句

流程图

直到型循环

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

C语言语句

C语句分类

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

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

表达式语句:b=3;

空语句:;

复合语句:{...}

关注:输入输出语句(printf()/scanf())

补充

6818开发板:

需求:将一张BMP图片显示到开发板的LCD屏幕上

说明:

 屏幕显示:BGR

图片显示:RGB

实现:RGB --> BGR

B:右移0个字节,也就是移动0位 B >> 0

R:右移2个字节,也就是移动16位 R >> 16

G:右移1个字节,也就是移动8位 G >> 8

输入输出缓冲机制

概述

缓冲区又称缓存,是内存的一部分。在内存空间预留一定的存储空间(缓冲区),用来缓冲输入或者输出的数据。缓冲区根据对应的输入输出设备,分为输入缓冲区和输出缓冲区。

为什么要由缓冲区

1.减少io设备的操作

2.提高计算机的运行速度。

比如从磁盘中读取数据,先将读出的数据放在缓冲区计算机直接从缓冲区读取数据,等待数据取完后,缓冲区再从磁盘中读取,这样会减少磁盘的读写次数。因为计算机对缓冲区的操作远远快于磁盘的操作,所以应用缓冲区可以提供计算机运行速度。

缓冲区

全缓冲:适合文件的读写。当缓冲区满存之后,才会实际进行io操作。比如对磁盘文件的读写。

Windows全缓冲区大小为4096字节,linux全缓冲区大小为1024字节

行缓冲:在加\n时触发。在输入和输出中遇到换行符,执行io操作。也就是冲刷缓冲区数据。如键盘输入数据

不带缓冲:不进行缓冲,出错信息可以直接尽快显示出来

引发缓冲区的刷新

    1. 遇到换行符\n
    2. 缓冲区存满
    3. 执行fflush(stdout),手动刷新

实现原理

说明:

录入:输入输出操作的内部采用的缓冲机制,也就是当我们用scanf()输入数据时,并不是直接将键盘 录入的数据存储到内存变量中,而是系统会先去输入缓冲区查看是否有符合类型的数据,如果存在将 直接输入缓冲区中的数据到内存变量,此时就不用键盘录入,否则猜需要键盘录入复合类型的数据。

输出:相同道理,当我们使用printf()输出数据时,也并不是直接将内存变量存储的数据输出到输出设 备,而是先存储到输出缓冲区,当输出缓冲区被充满,或输出缓冲区中出现换行符,或者执行 fflush(),才会将输出缓冲区的数据输出到标准输出设备。(打印机也是,我们测试用的是控制台显示 终端)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值