嵌入式全栈开发学习笔记---C语言笔试复习大全5

本文主要回顾了C语言中的运算符,包括算术、关系、逻辑、位运算等,并强调了运算符优先级的重要性,特别提到了自增自减运算符的使用规则和面试中的常见考察点。同时,文章还讨论了C++与C的不同之处,以及在编程中的注意事项。
摘要由CSDN通过智能技术生成

目录

C语言运算符

运算符优先级

自增自减运算符(笔试重点)

笔试题6

笔试题7


上一篇复习了常量和变量,输入和输出,这一篇我们开始复习C语言的运算符及其优先级。

说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。

这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。

注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做是为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!

vim编辑器的一些工作命令在之前的博文中已经详细介绍过了,如果不了解可以先去看看。

我们正式开始:

C语言运算符

1、算术运算符 (+  -  *  /(取整)  %(取余))    

2、关系运算符 (> <  ==  >=  <=  !=(不等于))

3、逻辑运算符 ((非,用于逻辑取反) &&(短路与)  ||(短路或))

短路原则:比如“if(表达式1 ||表达式2)”:如果表达式1已经成立,则不会执行表达式2。这个到我们学C++的时候会有个很重要的结论,先记住它。

4、位运算符   (<<   >>   ~(非,按位取反)   |(逻辑或,按位加,通常用于位置1) ∧(异或,同0,异1) &(逻辑与,按位乘,通常用于位清零))

!和 ~ 取反的区别在于一个逻辑取反,一个是按位取反,比如!5就是非0变成0,~5就是00000101变成1111 1010,结果就是!5=0,~5=250。

5、赋值运算符 (=及其扩展赋值运算符)  

6、条件运算符 (?:)

通常用于比较,也叫三目运算符,比如int max=(a>b)?a:b;,a和b先比较,如果条件成立,则把a赋值给max,如果不成立,则把b赋值给max。注意:int max=(a>b)?a:b=3;这句代码是错误的,记住,在C语言中,条件运算符不能作为左值使用。(在C++中可以!)

7、逗号运算符  (,)结合for循环来讲

8、指针运算符 (*和&)

9、求字节数运算符(sizeof)

10、强制类型转换运算符( (类型) )

11、分量运算符(.   ->)

12、下标运算符([])

13、其他 (如函数调用运算符())

注:7~13后面再详细复习

运算符优先级

优先级从高到低排列如下:

函数符号() 和数组下标[]  (优先级最高)

单目运算符

算数运算符

移位运算符

关系运算符

逻辑运算符

三目运算符 (优先级最低)

注意:单目运算符、双目运算符,三目运算符怎么区分?

根据参与运算的参数判断,比如说a++,这个++就是单目运算符,因为它只需要一个参数a;而a+b的+属于双目运算符,因为它需要两个参数;int max=(a>b)?a:b;的?:就属于三目运算符,因为它需要三个参数。

能背下优先级表的人凤毛麟角

用括号来控制运算顺序更直观、方便,并减少出错的概率,但是笔试的时候会考!所以建议背下来。

自增自减运算符(笔试重点)

1、i++/i--

等价于i = i + 1 或者 i = i - 1

执行i所在语句之后,对i的值加一/减一

2、++i/--i

等价于i = i + 1 或者 i = i - 1

执行i所在语句之前,对i的值加一/减一

注意:C语言前置++不能做左值,但是在C++里面是可以的。

所以我们写个笔试题,并用g++编译看看结果(g++是C++编译工具,gcc是C语言的编译工具)

笔试题6

问:

(1)

a=1;

a += a++;

a=?

(2)

a=1;

a += ++a;   

a=?

(3)

a=1;

++a += a;  

a=?

(4)

a=1;

++a += a++;

a=?

(5)

a=1;

++a += ++a;

a=?

答案是:

(1)a=3

(2)a=4

(3)a=4

(4)a=5

(5)a=6

解:

(1)a=a+a=1+1=2, a+1=2+1=3;

(2)单目运算符的优先级高,先运行前置++,a+1=1+1=2,a=a+a=2+2=4;

(3)单目运算符的优先级高,先运行前置++,a+1=1+1=2,a=a+a=2+2=4;

(4)单目运算符的优先级高,先运行前置++,a+1=1+1=2,a=a+a=2+2=4,a+1=4+1=5,这条代码在不同编译器编译出来的结果可能不相同,有的编译器编译出来的结果是4,所以大家自己写代码的时候不要写这种有歧义的代码,这里只是给大家演示一下。

(5)单目运算符的优先级高,先运行前置++,a+1=1+1=2,a+1=2+1=3,a=a+a=3+3=6,这条代码在不同编译器编译出来的结果可能不相同,有的编译器编译出来的结果是5。

g++编译结果为

如果用gcc编译的话它会报错,左值无效,

所以,C语言前置++不能做左值,但是在C++里面是可以的。

笔试题7

问:以下两种情况输出的i和k分别是多少?

(1)

int i = 3, k;

k = (++i) + (++i) + (i++);

printf("i = %d, k = %d\n", i, k);

(2)

i = 3;

k = (++i) + (++i) + (++i);

printf("i = %d, k = %d\n", i, k);

以上代码在windows和Linux系统中输出的结果可能不同,

第一种编译方式是将三个参数当成一个整体表达式,编译结果是:

(1)单目运算符的优先级高,先运行完前置++再进行双目运算符的加法运算,i初始值为3,i+1=4, i+1=5,输出k=5+5+5=15,i+1=6,最终i=6

(2)i初始值为3,i+1=4, i+1=5,i+1=6,输出k=6+6+6=18,i=6

第二种编译方式是将前两个参数当成一个整体表达式,然后将其结果与第三个参数进行运算,编译结果是:

(1)i+1=4, i+1=5, 5+5=10, 输出k= 10+5=15 ,i+1=6

(2)i+1=4, i+1=5,5+5=10, i+1=6,输出k=10+6=16, i=6

这种有歧义的代码不需要纠结它的编译方式到底是哪一个,笔试的时候遇到,就只能看我们跟面试官的缘分了。

以上就是这篇内容,如想了解更多,欢迎订阅本专栏!

如有问题可评论区或者私信留言,如果想要进交流群请私信!

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vera工程师养成记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值