小编use*_*467的帖子

未定义表达式的汇编程序调试

我试图更好地理解编译器如何为未定义的表达式生成代码,例如以下代码:

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)

c assembly x86-64 undefined

10
推荐指数
2
解决办法
667
查看次数

具有明确答案的未定义表达?

我试图理解面试问题的答案.

提供以下代码:

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,我认为这也是可行的,即如果后增量副作用发生在序列点的最后.

我没有答案键,因此很难确定最佳答案是什么.

这只是一个不好的问题还是答案更明显?

c undefined

4
推荐指数
1
解决办法
79
查看次数

标签 统计

c ×2

undefined ×2

assembly ×1

x86-64 ×1