请帮忙!我有麻烦了。这个问题是在大学时给我的,老师几乎没有解释任何事情。考虑到3的原始值乘以b的递增值3然后在执行表达式之后将值9分配给a,对我来说答案将是10。后增量然后将其值增加到10。
老师说我错了。没有任何解释。他只是说a不会在这里增加。
现在我已经检查了几个网站来调查这个问题。我已经学会了诸如i = i ++或a = a ++之类的案例未定义,应该不惜一切代价避免。但是当它在大学的测试中提供,然后标记正在丢失的过程中,我真的没有选择避免它并超越它。
在浏览互联网时,我偶然发现这个网站在不同的编译器下显示不同的值: http://gynvael.coldwind.pl/?id=372
现在再次提出我的问题。真的有答案吗?我理解大多数编译器最终都会显示9,因为堆栈替换过程发生了(由谷歌教授,但不是我所在的大学),我也理解在某些情况下编译器会遵循我的逻辑过程。对我来说更有意义,因为“++”完全没有任何理由存在,如果它甚至不会增加变量对我没有意义,我也看不到它的目的,谷歌也不会告诉我这条逻辑路径的目的。无论哪种方式,我应该声称我的答案不值得交叉(✘)或者我应该接受它而不是针对刻度(✔)并且不会丢失任何标记。
答案 0 :(得分:1)
这里有两个不同的答案。
当然,正确答案是“它未定义”。一旦我们知道这一点,调查答案可能是9,或4,或10,或“四十二”,或“无色的绿色想法”,或从您的计算机屏幕冒出来是毫无意义的。关于为什么它未定义,已经写了太多的词,所以我不会在这里再练习那些论点。
但是,有一段时间,你会发现自己正在和一个比你知之甚少的教练打交道,这意味着如果你想获得最好的成绩,你的挑战就是弄清楚,不是哪个答案是正确的,而是哪个回答你的导师认为是对的。
因此,请记住,第二个问题与C编程语言几乎没有关系,我们可以问,您的教师可能会认为a = a++ * ++b
可能意味着什么?有两种可能的解释:
解释1:a++
给出3并将4分配给a
,++b
给出3并将3分配给b
,3 * 3为9,分配给a
。
解释2:与上述类似,但我们注意到a
分配了两个不同的内容,我们真的不知道它们会发生什么顺序,所以也许a
会结束最后包含4个。
同样,我不是在这里谈论C.在C中,我们根本不能说这个表达式意味着什么,除了它是未定义的。在C中,想知道将{4}或9分配给a
“先发生”是否可以保证让你陷入困境。其他五个Stackoverflow常客现在正悬停在评论按钮上,等着告诉我,我的教练甚至错误地建议我上面的解释1和2。
但最后,我不得不说我会认为10是一个不太可能的结果。虽然我不会惊讶地得到一个10,如果我确实得到了这个结果,那只会是因为,对于一个未定义的表达式,任何结果都是可能的,并且结果可以基本上是随机的,基于编译器的傻傻怪癖没有人(除了编译器编写者之外)也不会理解。
但是回到你的问题,你假设编译器可能会做的一件事是a
获得9,然后因a++
部分而加1,不太可能。我对a++
的思考方式,我相信一种思考编译器如何看待a++
的好方法是:“取a
的值,加一个,得到将旧的(未增加的)值输出到周围的表达式,记下将增加的值存储回a
以后的某个时间(但在下一个序列点之前)“。我不希望实际的编译器为自己做一个注释,以便稍后获取a
的值并向其添加1(在这种情况下产生10)。所以我不同意你的导师说你错了,但我同意编译器不太可能这样做(尽管我认为可能)。