
基本测试
-
在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、指令集、微架构、计算机系统架构、总线与地址等有一个完整的 认知框架
半导体、导电、硅、集成