我试图更好地理解编译器如何为未定义的表达式生成代码,例如以下代码:
int main()
{
int i = 5;
i = i++;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是由gcc 4.8.2生成的汇编程序代码(优化是关闭-O0,我插入了自己的行号以供参考):
(gdb) disassemble main
Dump of assembler code for function main:
(1) 0x0000000000000000 <+0>: push %rbp
(2) 0x0000000000000001 <+1>: mov %rsp,%rbp
(3) 0x0000000000000004 <+4>: movl $0x5,-0x4(%rbp)
(4) 0x000000000000000b <+11>: mov -0x4(%rbp),%eax
(5) 0x000000000000000e <+14>: lea 0x1(%rax),%edx
(6) 0x0000000000000011 <+17>: mov %edx,-0x4(%rbp)
(7) 0x0000000000000014 <+20>: mov %eax,-0x4(%rbp)
(8) 0x0000000000000017 <+23>: mov $0x0,%eax
(9) 0x000000000000001c <+28>: pop %rbp
(10) 0x000000000000001d <+29>: retq
End of assembler …Run Code Online (Sandbox Code Playgroud) 我试图理解面试问题的答案.
提供以下代码:
int x = 5;
int y = x++ * ++x;
What is the value of y?
Run Code Online (Sandbox Code Playgroud)
答案显示为多项选择答案的列表,其中一个是35.
在我的机器上编写和运行此代码会导致y等于35.
因此,我希望将这个问题的答案标记为35.
但是,由于x ++,这个表达式不是未定义的,即效果的一面(x的实际增量)可能随时发生,具体取决于编译选择编译代码的方式.
因此,我不会认为您可以确定答案是35,因为不同的编译器可能会产生不同的结果.
另一个可能的多选答案是30,我认为这也是可行的,即如果后增量副作用发生在序列点的最后.
我没有答案键,因此很难确定最佳答案是什么.
这只是一个不好的问题还是答案更明显?