20240705 嵌入式C语言自我修养
明昧 Lv7

基本测试

  • 在C程序编译过程中,什么是语法检查、语义检查?两者有何 区别?

  • 什么是表达式?什么是语句?什么是代码块?

  • 什么是左值、右值、对象、副作用、未定义行为?

什么是标识符、关键字和预定义标识符?三者有何区别?

简洁版

标识符是定义名字,由字母、数字和下划线组成,并且必须以字母或下划线开头。

myVariable

calculateSum

printMessage


关键字

语法关键

if

else

for

while

int


预定义标识符

预定义标识符是在编程语言中预先定义的标识符,具有特殊的含义和功能,用于表示语言提供的常用功能、库函数或预定义常量等。

在编程语言中,标识符、关键字和预定义标识符是三个不同的概念。

标识符(Identifier):标识符是用来表示变量、函数、类、对象等程序实体的名称。它由字母、数字和下划线组成,并且必须以字母或下划线开头。标识符的命名应具有描述性和可读性,以便于理解和维护代码。

例如,在C语言中,以下是一些有效的标识符:

myVariable
calculateSum
printMessage

关键字(Keyword):关键字是编程语言中具有特殊含义的保留字,用于表示语言的语法结构和关键功能。关键字不能用作标识符,因为它们已经被语言规范保留了。

例如,在C语言中,以下是一些关键字:

if
else
for
while
int

预定义标识符(Predefined Identifier):预定义标识符是在编程语言中预先定义的标识符,具有特殊的含义和功能。它们通常表示语言提供的一些常用功能、库函数或预定义常量等。

例如,在C语言中,以下是一些预定义标识符:

NULL
sizeof
printf
scanf

区别:

标识符是程序员自定义的名称,用于表示变量、函数、类等实体。
关键字是编程语言中具有特殊含义的保留字,不能用作标识符。
预定义标识符是在编程语言中预先定义的标识符,具有特殊的含义和功能,用于表示语言提供的常用功能、库函数或预定义常量等。

总的来说,标识符是程序员自定义的名称,关键字是编程语言的保留字,而预定义标识符是编程语言预先定义的具有特殊含义的标识符。

什么是结合性、左结合、右结合?

右结合性,就是在表达式中最右边的操作最先执行,然后从右到左依次执行
左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。

在标准C语言的文档里,对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。

每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性

优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。

例如,在表达式ab+c中,乘法运算的优先级高于加法运算符的优先级,所以先执行乘法ab,而不是加法b+c。

但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符,结合性就起仲裁的作用,由它决定哪个操作符先执行。像下面这个表达式:

int a,b=1,c=2;

a=b=c;

我们发现,这个表达式只有赋值符,这样优先级就无法帮助我们决定哪个操作先执行,是先执行b=c,还是先执行a=b?

如果按前者,结果为2,如果按后者,a的结果为1。

所有的赋值符(包括复合赋值)都具有右结合性,就是在表达式中最右边的操作最先执行,然后从右到左依次执行。

这样,c先赋值给b,然后b在赋值给a,最终a的值是2。

类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。

结合性只用于表达式中出现两个以上相同优先级的操作符的情况,用于消除歧义。事实上你会注意到所有优先级相同的操作符,它们的结合性也相同。

这是必须如此的,否则结合性依然无法消除歧义,如果在计算表达式的值时需要考虑结合性,那么最好把这个表达式一分为二或者使用括号。

例:

a = b+c+d

=是右结合的,所以先计算(b+c+d),然后再赋值给a

+是左结合的,所以先计算(b+c),然后再计算(b+c)+d

C语言中具有右结合性的运算符包括所有单目运算符(~取反、!取非、-负号、+正号、++自增、–自减)以及赋值运算符(=)和条件运算符(?:)。其它运算符都是左结合性。

在C语言中有少数运算符在C语言标准中是有规定表达式求值的顺序的:

1:&& 和 || 规定从左到右求值,并且在能确定整个表达式的值的时候就会停止,也就是常说的短路。

2:条件表达式的求值顺序是这样规定的:

test ? exp1 : exp2;

条件测试部分test非零,表达式exp1被求值,否则表达式exp2被求值,并且保证exp1和exp2两者之中只有一个被求值。

3:逗号运算符的求值顺序是从左到右顺序求值,并且整个表达式的值等于最后一个表达式的值,注意逗号’,'还可以作为函数参数的分隔符,变量定义的分隔符等,这时候表达式的求值顺序是没有规定的!

判断表达式计算顺序时,先按优先级高的先计算,优先级低的后计算,当优先级相同时再按结合性,或从左至右顺序计算,或从右至左顺序计算。

优先级 运算符 名称或含义 使用形式 结合方向 说明
1 [] 数组下标 数组名[常量表达式] 左到右
() 圆括号 (表达式)/函数名(形参表)
. 成员选择(对象) 对象.成员名
-> 成员选择(指针) 对象指针->成员名
2 - 负号运算符 -表达式 右到左 单目运算符
(类型) 强制类型转换 (数据类型)表达式
++ 自增运算符 变量名/变量名 单目运算符
自减运算符 –变量名/变量名– 单目运算符
* 取值运算符 *指针变量 单目运算符
& 取地址运算符 &变量名 单目运算符
! 逻辑非运算符 !表达式 单目运算符
~ 按位取反运算符 ~表达式 单目运算符
sizeof 长度运算符 sizeof(表达式)
3 / 表达式/表达式 左到右 双目运算符
* 表达式*表达式 双目运算符
% 余数(取模) 整型表达式/整型表达式 双目运算符
4 + 表达式+表达式 左到右 双目运算符
- 表达式-表达式 双目运算符
5 << 左移 变量<<表达式 左到右 双目运算符
>> 右移 变量>>表达式 双目运算符
6 > 大于 表达式>表达式 左到右 双目运算符
>= 大于等于 表达式>=表达式 双目运算符
< 小于 表达式<表达式 双目运算符
<= 小于等于 表达式<=表达式 双目运算符
7 == 等于 表达式==表达式 左到右 双目运算符
!= 不等于 表达式!= 表达式 双目运算符
8 & 按位与 表达式&表达式 左到右 双目运算符
9 ^ 按位异或 表达式^表达式 左到右 双目运算符
10 | 按位或 表达式|表达式 左到右 双目运算符
11 && 逻辑与 表达式&&表达式 左到右 双目运算符
12 || 逻辑或 表达式||表达式 左到右 双目运算符
13 ?: 条件运算符 表达式1? 表达式2: 表达式3 右到左 三目运算符
14 = 赋值运算符 变量=表达式 右到左
/= 除后赋值 变量/=表达式
*= 乘后赋值 变量*=表达式
%= 取模后赋值 变量%=表达式
+= 加后赋值 变量+=表达式
-= 减后赋值 变量-=表达式
<<= 左移后赋值 变量<<=表达式
>>= 右移后赋值 变量>>=表达式
&= 按位与后赋值 变量&=表达式
^= 按位异或后赋值 变量^=表达式
|= 按位或后赋值 变量|=表达式
15 , 逗号运算符 表达式,表达式,… 左到右 从左向右顺序运算

嵌入式技术栈

C语言编程,还要对计算 机原理和系统结构、CPU工作原理、ARM汇编语言、硬件电路等基础知 识和理论有一定的掌握。

掌握了CPU的工作原理,可以更好地理解指令 到底是如何执行的;

掌握计算机的工作原理和系统结构,可以更好地 理解程序的编译、链接、安装和运行机制;

掌握一门汇编语言,可以 从底层的角度去看C语言,可以帮助我们更好地理解C语言。

我们编写 的C程序,最终都会转换成CPU所支持的二进制指令

而汇编语言又是 这些指令集的助记符,通过反汇编代码,我们可以更加深刻地理解编 译器的特性和C语言的语法

如果你有幸在芯片原厂从事嵌入式研发工 作,可能还要和一帮IC工程师、硬件工程师打交道,和他们一起解决 芯片、硬件电路中的各种问题。为了更好地和他们沟通,你可能还需 要对半导体知识、IC行业的专业术语有一定的了解,如逻辑综合、前 端设计、后端设计、仿真验证、tap-out、Die等。

计算机体系结构与CPU工作原理

科普一下CPU的制造过程,科普一下一款处理器是如何从一堆沙子变成 市场上销售的芯片的,以及CPU的工作原理和计算机体系结构的相关知 识。预期目标是希望通过本章的学习,让大家对半导体工艺、芯片、 CPU、指令集、微架构、计算机系统架构、总线与地址等有一个完整的 认知框架

半导体、导电、硅、集成

 Comments
Comment plugin failed to load
Loading comment plugin
Powered by Hexo & Theme Keep
Unique Visitor Page View