目录
上一篇复习了常量和变量,输入和输出,这一篇我们开始复习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
这种有歧义的代码不需要纠结它的编译方式到底是哪一个,笔试的时候遇到,就只能看我们跟面试官的缘分了。
以上就是这篇内容,如想了解更多,欢迎订阅本专栏!
如有问题可评论区或者私信留言,如果想要进交流群请私信!