qq_没疯度_0
2015-08-15 11:56
在3-3一节中说了啊,不论是b++还是++b都是b=b+1,那么b=10啊??
所以说这个课程糟透了,很多都没讲清楚。
通常说,a++是先取值后运算,++a是先运算后取值。实际上这里涉及“运算符” “表达式”的概念。
++ 是一个“自增运算符”,自增运算符有两种形式:前置自增(++a)和后置自增(a++)。
运算符和操作数合起来就是一个表达式(a++、++a都是表达式,a就是操作数)。注意:每一个表达式本身都有值(和其类型),有的表达式还有“副作用”。比如自增表达式的副作用就是使其操作数自增1。那么自增运算表达式的值是什么呢? a++ 的值就是 a 的值,而 ++a 的值等于 a+1。
所以如果b是9,b++的值就是9,在之后b的值会变成10(副作用),那么这个之后是什么时候呢?
这涉及到另一个关键内容“序列点”,副作用在序列点后保证会发生(请注意这一句的措辞)。序列点这个概念比较复杂,语句结束时算是序列点,逻辑运算符处也是一个序列点......还有其他的情况,就不细说了。总之序列点之前的运算符的副作用,在执行到这点以后都保证会发生。注意并不是在过了这一点后就突然发生的,这些副作用可能在序列点前的任何一个位置发生,C标准只是规定在序列点之后这些副作用必须已经发生了。
所以:
选项A: b++的值就是9,小于5*2,所以表达式前半部分为false,由于是逻辑与运算符,所以不再继续判断后半部分了,整个表达式就是false。
选项B: b++ >= a*2 还是false,因为是逻辑或运算符,所以继续判断后半部分,又因为逻辑运算符处为序列点,所以 b - a <= a 中的b已经自增了,值成10,10-5<=5为true。整个表达式为true。
选项C: 5*2-9 = 1,1的非为false。
选项D: ++b的值是9+1=10,10-5*2=0,0被视为false。
C语言入门
926938 学习 · 21533 问题
相似问题
回答 1