首页 > 编程语言 >嵌入式学习第9天——C语言运算符,程序设计结构,输入输出缓冲机制

嵌入式学习第9天——C语言运算符,程序设计结构,输入输出缓冲机制

时间:2024-07-25 20:00:11浏览次数:14  
标签:int 嵌入式 运算符 ++ printf 缓冲区 C语言 表达式

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

相关文章

  • C语言i++和++i操作
    关于++混合操作,不同计算结果推理第一种编译结果:inti=5;intsum=(++i)+(++i)=6+7=13第二种编译结果:inti=5;intsum=(++i)+(++i)=6+7=7+7前面的7是因为后面i的变化被影响后,重新赋值=14第一种编译结果:inti=5;intsum=(++i)+(i++)=......
  • 【嵌入式开发之标准I/O】流的刷新、定位以及格式化输出、输入
    流的刷新intfflush(FILE*fp);成功时返回0;出错时返回EOF。将流缓冲区中的数据写入实际的文件。Linux下只能刷新输出缓冲区,输入缓冲区丢弃。如果输出到屏幕使用fflush(stdout)。流的定位流的定位:ftell()函数 longftell(FILE*stream);ftell() 函数的作用是......
  • 【嵌入式开发之标准I/O】二进制文件的读写及实验
    文本文件和二进制的区别文本文件和二进制文件的区别主要在于它们的编码方式和数据组织方式。‌编码方式:‌文本文件是基于字符编码的文件,‌常见的编码有ASCII编码、‌UNICODE编码等。‌这些编码将字符映射到特定的二进制值,‌使得字符可以在计算机中存储和传输。‌相比之下,‌......
  • 学懂C语言(二十五):深入理解 C语言结构体 位域 的概念
            目录一、位域的基本概念二、位域的定义三、位域的内存分配和大小计算示例1:简单位域示例2:跨越多个存储单元注意事项结构体对齐控制总结        C语言中的位域(Bit-Field)是一种特殊的数据结构,允许在结构体中定义占用特定位数的成员,主要用于节......
  • 嵌入式学习--DAY10:函数的调用
    一、函数参数和函数的值1.在定义函数中指定的形参,在未出现函数调用时,它们并不占用内存中的存储单元,只有在发生函数调用时,函数中的形参才会被分配内存单元。在调用结束后,形参所占的内存单元也会被释放。2.实参可以是常量、变量或表达式。在被定义的函数中,必须指定形参的类型,实......
  • C语言:字符串函数、内存函数剖析
    字符串函数、内存函数剖析一、字符串函数(一)求字符串长度1、strlen(1)库函数实现(2)自定义实现(二)长度不受限制的字符串函数1、strcpy(1)库函数实现(2)自定义实现2、strcat(1)库函数实现(2)自定义实现3、strcmp(1)库函数实现(2)自定义实现(三)长度受限制的字符串函数介绍1、strncpy2、s......
  • 嵌入式工控机和4U工控机的区别
    在现代工业自动化和智能控制领域,工控机(工业计算机)作为关键的硬件支撑,扮演着至关重要的角色。随着技术的进步和市场需求的多样化,工控机的种类和形态不断丰富。其中,嵌入式工控机与4U工控机是两种常见的工业计算机类型。它们在结构、功能、应用场合等方面存在显著的区别。本文将详细......
  • 随记0000——从0、1 到 C语言
    C语言的发展历程是计算机科学史上的一个重要里程碑。下面是从最早的机器语言到汇编语言,再到高级语言如C语言的简化演进过程:1.机器语言定义与特点机器语言是最底层的编程语言,由一系列二进制代码组成。直接被CPU执行,无需转换或编译。难以阅读、编写和维护。2.汇编语......
  • 2个月搞定计算机二级C语言——真题(2)解析
    1.前言大家好,我是梁国庆。本篇博客讲解真题2,其中的填空题用到了指向结构体的指针访问被指结构体的成员的知识,我在下文做了讲解。其他的主要还是对数组的考察,没什么难度,搞清楚思路写程序就可以。2.程序填空题2.1题目要求2.2提供的代码#include<stdio.h>#include<st......
  • C语言【面试】常用知识点总结之常用易错易混点解析
    第二部分:程序代码评价或者找错有符号整型和无符号整型混合运算时,有符号型自动转换成无符号型,运算的结果是无符号的。如果参与运算的数据类型不同,会自动转化为同一类再运算,这就是自动转换自动转换的规则如下:1.当参与运算的数据的类型不同时,编译系统会自动先将他们转换成......