(嵌入式八股)第1章 C语言(一)
1.1 运算符
运算符高低转换(类型转换)
C语言中的运算符会遵循一定的规则来进行类型转换,通常遵循“低等类型向高等类型转换”的原则。这是因为高等类型能够表示更多的值范围和精度。例如:
- 如果你有
3.0 * 6,这里3.0是浮点数,6是整数。编译器会自动将6转换为浮点数,以确保乘法操作的结果是浮点型(float或double)。 - 类型的等级关系如下:
这意味着对于数字类型,double 是最高等级,而 char 和 short 是较低等级。
a 是一个浮点数(float 类型),而 b 是一个整数(int 类型)。a * b 中,运算符 * 的作用是执行乘法,但由于一个操作数是浮点数,编译器会自动将 b 从 int 类型转换为 float,以确保运算结果符合浮点数的精度要求。b 会被提升为 float 类型,然后执行浮点乘法,结果是一个 float 类型。运算符优先级
运算符的优先级决定了在没有括号改变运算顺序时,哪些运算先进行。C语言中的运算符优先级规则如下:
- 从高到低优先级:() (括号)[] (数组下标)!(逻辑非)自增自减运算符 (++, --)sizeof(取sizeof)* (指针),& (取地址),& (按位与)
- 算术操作符(如 +, -, *, /, %)优先级较高,但低于数组下标、取地址等。
- 关系操作符(如 ==, !=, <, <=, >)优先级较算术操作符低。
- 逻辑操作符(如 &&, ||)优先级更低。
- 赋值操作符(如 =, +=, -= 等)优先级最低,且赋值操作符的结合方向是从右到左。所有赋值运算符的运算顺序都是从右向左进行的。
*) 的优先级高于加法 (+)。3 * 2 = 6,然后执行加法 5 + 6 = 11。11。运算符的结合方向
运算符的结合方向决定了当表达式中存在多个相同优先级的运算符时,如何进行计算。C语言中的运算符大多是从左到右结合的,但有些例外:
- 从右到左结合的运算符:
- 赋值运算符(=, +=, -= 等)
- 条件运算符(?:)
- 自增自减运算符(++ 和 -- 在某些情况,如后缀自增自减时,也有从右到左的特性)
- 从左到右结合的运算符:所有其他二元运算符(如 +, -, *, / 等)
- 和 + 运算符的优先级是相同的,且它们是从左到右结合的。10 - 2 = 8,然后执行 8 + 3 = 11。11。运算符优先级表
1 |
[] |
数组下标 |
数组名[常量表达式] |
左到右 |
|
1 |
() |
圆括号 |
(表达式)或函数名(形参表) |
左到右 |
|
1 |
. |
成员选择(对象) |
对象.成员名 |
左到右 |
|
1 |
-> |
成员选择(指针) |
对象指针->成员名 |
左到右 |
|
2 |
- |
负号运算符 |
-表达式 |
右到左 |
单目运算符 |
2 |
(类型) |
强制类型转换 |
(数据类型)表达式 |
右到左 |
|
2 |
++ |
自增运算符 |
++变量名 或 变量名++ |
右到左 |
单目运算符 |
2 |
-- |
自减运算符 |
--变量名 或 变量名-- |
右到左 |
单目运算符 |
2 |
* |
取值运算符 |
*指针变量 |
右到左 |
单目运算符 |
2 |
& |
取地址运算符 |
&变量名 |
右到左 |
单目运算符 |
2 |
! |
逻辑非运算符 |
!表达式 |
右到左 |
单目运算符 |
2 |
~ |
按位取反运算符 |
~表达式 |
右到左 |
单目运算符 |
2 |
sizeof |
长度运算符 |
sizeof(表达式) |
右到左 |
|
3 |
/ |
除 |
表达式/表达式 |
左到右 |
双目运算符 |
3 |
* |
乘 |
表达式*表达式 |
左到右 |
双目运算符 |
3 |
% |
余数(取模) |
整型表达式%整型表达式 |
左到右 |
双目运算符 |
4 |
+ |
加 |
表达式+表达式 |
左到右 |
双目运算符 |
4 |
- |
减 |
表达式-表达式 |
左到右 |
双目运算符 |
5 |
<< |
左移 |
变量<<表达式 |
左到右 |
双目运算符 |
5 |
>> |
右移 |
变量>>表达式 |
左到右 |
双目运算符 |
6 |
> |
大于 |
表达式>表达式 |
左到右 |
双目运算符 |
6 |
>= |
大于等于 |
表达式>=表达式 |
左到右 |
双目运算符 |
6 |
< |
小于 |
表达式<表达式 |
左到右 |
双目运算符 |
6 |
<= |
小于等于 |
表达式<=表达式 |
左到右 |
双目运算符 |
7 |
== |
等于 |
表达式==表达式 |
左到右 |
双目运算符 |
7 |
!= |
不等于 |
表达式!=表达式 |
左到右 |
双目运算符 |
8 |
& |
按位与 |
表达式&表达式 |
左到右 |
双目运算符 |
9 |
^ |
按位异或 |
表达式^表达式 |
左到右 |
双目运算符 |
10 |
| |
按位或 |
表达式|表达式 |
左到右 |
双目运算符 |
11 |
&& |
逻辑与 |
表达式&&表达式 |
左到右 |
双目运算符 |
12 |
|| |
逻辑或 |
表达式||表达式 |
左到右 |
双目运算符 |
13 |
?: |
条件运算符 |
表达式1? 表达式2: 表达式3 |
右到左 |
三目运算符 |
14 |
= |
赋值运算符 |
变量=表达式 |
右到左 |
|
14 |
/= |
除后赋值 |
变量/=表达式 |
右到左 |
|
14 |
*= |
乘后赋值 |
变量*=表达式 |
右到左 |
|
14 |
%= |
取模后赋值 |
变量%=表达式 |
右到左 |
|
14 |
+= |
加后赋值 |
变量+=表达式 |
右到左 |
|
14 |
-= |
减后赋值 |
变量-=表达式 |
右到左 |
|
14 |
<<= |
左移后赋值 |
变量<<=表达式 |
右到左 |
|
14 |
>>= |
右移后赋值 |
变量>>=表达式 |
右到左 |
|
14 |
&= |
按位与后赋值 |
变量&=表达式 |
右到左 |
|
14 |
^= |
按位异或后赋值 |
变量^=表达式 |
右到左 |
|
14 |
|= |
按位或后赋值 |
变量|=表达式 |
右到左 |
|
15 |
, |
逗号运算符 |
表达式,表达式,... |
左到右 |
1.2 C语言标识符的命名规则
标识符的基本构成
标识符必须符合以下构成规则:
- 必须以字母(aZ)或下划线(_)开头,后面可以是字母、数字(0~9)或下划线。
- 有效标识符例子:
- count
- total_sum
- _myVariable
- Var1
- 无效标识符例子:
- 1variable(不能以数字开头)
- @sum(不能包含特殊字符)
标识符区分大小写
C语言的标识符是区分大小写的。这意味着 Variable 和 variable 被视为不同的标识符。
这里,Variable 和 variable 是两个不同的变量。
标识符长度
- C89标准规定标识符长度不得超过31个字符。
- C99标准规定标识符长度不得超过63个字符。
通常,编译器会根据所支持的标准来决定允许的最大标识符长度。
关键字不能作为标识符
C语言有一组关键字(如 int, if, return 等),它们有特定的意义,因此不能被用作标识符。
无效标识符:
有效标识符:
自定义标识符的命名习惯
虽然C语言允许使用任意字符来命名标识符,但最好使用具有明确意义的名字,这有助于代码的可读性和维护。例如,使用 counter 代替 x,使用 totalSum 代替 sum。
避免使用单个字母如 a、b 或过于简短的名字,这样的名字虽然合法,但很难理解其含义。
标识符命名规范是编写清晰、易于理解代码的基础。
遵循这些规则,可以确保代码的可维护性和可读性。在命名时,使用具有描述性的名称将大大提高代码的质量。
1.3 字符数组初始化
在C语言中,数组的初始化有不同的方式,尤其是对于字符数组(字符串)的初始化。
字符数组初始化
在C语言中,字符串实际上是字符数组,其中的每个字符都有一个对应的元素,并且每个字符串都会以一个特殊的字符 \0(空字符)结束,表示字符串的结束。
这里,arr1 是一个字符数组,包含三个元素:a,b 和 c。但是,没有显式添加空字符 \0,所以这个数组表示的是不完整的字符串。
这里,arr2 是一个字符数组,包含四个元素:'a','b','c' 和 '\0'。在C语言中,字符串常量 "abc" 会自动在最后加上 \0 字符,标识字符串的结束。
中,编译器会自动将其转换为 ,其中 是字符串的结束标志。剩余60%内容,订阅专栏后可继续查看/也可单篇购买
作者简介:仅用几个月时间0基础天坑急转嵌入式开发,逆袭成功拿下华为、vivo、小米等15个offer,面试经验100+,收藏20+面经,分享求职历程与心得。 专栏内容:这是一份覆盖嵌入式求职过程中99%问题指南,详细讲解了嵌入式开发的学习路径、项目经验分享、简历优化技巧、面试心得及实习经验,从技术面,HR面,AI面,主管面,谈薪一站式服务,助你突破技术瓶颈、打破信息差,争取更多大厂offer。

查看18道真题和解析