下面哪个式子不正确?
int a = 4;
A、a += (a++);
B、(++a) += (a++);
C、a += (++a);
D、(a++) += a;
答案是 D、(a++) += a;
一个表达式,需要把结果赋值给等于号的左边,即“左值”。
对象指的是某个具体的变量,左值就是对象的地址。
a = a + 5这样的表达式,左值是a,a具有实实在在的内存地址以及数值。
A + B = a + 5;左值为“A + B”, A有值,B有值,但是A+B的值是由系统临时生成,在内存的临时区域存着,
你可以说就算是临时区也有地址,那有什么意义呢,不知道地址,不能赋值,唯一知道的只是它存在于临时的区域中。说白了就是没有显式的存储地址。看选项,D的左边是a++,
++a返回的是(a+1)这个变量。
a++返回的是a的一个副本,也就是一个临时对象,temporary object。
显然不能往临时变量里赋值,D错误。
现在看看别的选项。
A、a += (a++);
看到这种问题非常讨厌,中国式教育特有的SB题。
在C语言中,对于这种式子并没有严格的规定,所以具体的执行就落在了编译器上,
对于这种未定义式,例如,式子中到底是先赋值还是先自增,则完全取决于编译器——“ 两件事我都会去做,至于先做什么后做什么就是我自己的事情了。 ”如果把这种式子放在有严格定义的C#之类的语言中则很明确。现在以C语言的目光来看待:
如果一个式子很麻烦,可以拆分语句(前缀自增的放前面,后缀自增的放后面)
a+=(a++);
可以如下看待:
a += a;
a++;
所以答案是9
B、(++a) += (a++);
继续拆:
a++;
a += a;
a++;
答案是11
C、a += (++a);
a++;
a += a;
答案是10
总结:这种编译器相关的代码,并且没有任何附加说明地出成题目,完全是脑残行为,根本就不应该出现在教科书上,特别是初学者所接触的教科书。
int a = 4;
A、a += (a++);
B、(++a) += (a++);
C、a += (++a);
D、(a++) += a;
答案是 D、(a++) += a;
一个表达式,需要把结果赋值给等于号的左边,即“左值”。
对象指的是某个具体的变量,左值就是对象的地址。
a = a + 5这样的表达式,左值是a,a具有实实在在的内存地址以及数值。
A + B = a + 5;左值为“A + B”, A有值,B有值,但是A+B的值是由系统临时生成,在内存的临时区域存着,
你可以说就算是临时区也有地址,那有什么意义呢,不知道地址,不能赋值,唯一知道的只是它存在于临时的区域中。说白了就是没有显式的存储地址。看选项,D的左边是a++,
++a返回的是(a+1)这个变量。
a++返回的是a的一个副本,也就是一个临时对象,temporary object。
显然不能往临时变量里赋值,D错误。
现在看看别的选项。
A、a += (a++);
看到这种问题非常讨厌,中国式教育特有的SB题。
在C语言中,对于这种式子并没有严格的规定,所以具体的执行就落在了编译器上,
对于这种未定义式,例如,式子中到底是先赋值还是先自增,则完全取决于编译器——“ 两件事我都会去做,至于先做什么后做什么就是我自己的事情了。 ”如果把这种式子放在有严格定义的C#之类的语言中则很明确。现在以C语言的目光来看待:
如果一个式子很麻烦,可以拆分语句(前缀自增的放前面,后缀自增的放后面)
a+=(a++);
可以如下看待:
a += a;
a++;
所以答案是9
B、(++a) += (a++);
继续拆:
a++;
a += a;
a++;
答案是11
C、a += (++a);
a++;
a += a;
答案是10
总结:这种编译器相关的代码,并且没有任何附加说明地出成题目,完全是脑残行为,根本就不应该出现在教科书上,特别是初学者所接触的教科书。