大学C语言考试易错知识点总结,c语言易错知识点

现在不少大学都把C语言作为一门必学的编程语言 。
C语言考试呢,并不能决定你的实践能力怎么样,他考的很多点,我们不知道,也可以在写代码时避免,我们举个最简单的例子,运算符优先级,这恐怕是必考的内容了 。但实际上我们写代码并不需要背下这个,我们完全可以通过多加几个括号解决问题 。但是考试它并不会管这些,考试是别人出的题,所以代码也是它的 。而我们也需要一个较高的分数,那么我们应该怎么办呢?


大学C语言考试易错知识点总结,c语言易错知识点

文章插图
没错,这篇博客就是为了这个而诞生的 。从cggwz个人的刷题经历,总结出易错的一些点,提醒大家在考试中注意,那么废话不多说,我们开始吧!
(再强调一遍:这里大部分是出卷人可能的设误点,而不一定是你自己写代码的易错点)
运算符相关
? 自增(减)前后缀
我们以自增为例,前缀和后缀的差别有两点:
优先级不同,后缀优先级更高
返回值不同
虽说优先级不同,但是在两者之间也就逻辑非和按位取反,貌似不会有太大影响 。
而重点是返回值,也就是说,++x返回的是x+1,而x++返回的是原来的x 。
而x本身的值都会在返回值以后立刻改变,也就是执行这个表达式后立即改变,比如:
#include
int main(){
int x=0,y=2,z=1;
x=z++ + z;
printf("%d",x);
return 0;
}
这个输出结果就是3,而不是2
? 逻辑运算符的短路问题
C语言在计算逻辑运算符的时候是采取短路机制的,也就是说,如果已经可以判断这个表达式的最终结果,那么就不再判断接下来的表达式,相应地,那些表达式也不会被执行 。而出题人则喜欢通过放置一些赋值语句在后面,某些学生会因为忽略了短路机制,而误以为会执行,从而出错,我们看个例子:
#include
int main(){
int x=3,y=2,z=1;
y=--z&&--x;
printf("%d",x);
return 0;
}
这里输出是2吗?
并不是,是3
因为--z返回的值是0,而后面的逻辑运算符是&&,也就是说无论后面一个语句真假与否,这个表达式都是假,所以就会触发短路机制,不再计算后面的++x,从而x的值不会改变 。
我们来看个变式:
#include
int main(){
int x=3,y=2,z=1;
y=--z&&--x||--x;
printf("%d",x);
return 0;
}
相信你现在应该能知道结果了,输出就是2.中间的那个–x并不会因为它在中间而被执行 。
? 赋值运算符的返回值问题
我们知道C语言中的赋值运算符是有返回值的 。
它们的返回值是赋值后被赋值变量的值,而不是赋值符号右边的表达式的值 。
比如int a=10;a+=3;这里的+=返回的就不是3,而是13.
这也适用于类型转换问题,比如double a;a=2;这里这个赋值语句的返回值就是2.0,而不是2.
? 运算符优先级的问题
考试前必须要掌握的内容之一 。
但是显然,我这里不会把一大张表放出来,要是需要看看课本就好了 。
这里我是想总结一下这张表,让大家更容易的“记住”这张表 。
我们也会顺带地总结一下结合方向 。
首先第一梯队,优先级最高的,是一些指代所属关系的运算符,比如[]、->、. 。在加上一个圆括号 。这个应该很好理解 。圆括号如同一个老大哥,它在改变运算顺序这方面具有绝对的话语权,自然会在第一梯队,而这个老大哥也是懂人情的,->、.这类符号就好像是调用父对象里的一个子对象,把人家父子关系拆散恐怕不是一个老大哥应该做的,所以它们也属于第一梯队 。它们的优先级是最高的 。

推荐阅读