我有两个类似的 while 循环,我很好奇为什么 C 编译器在每种情况下表现不同。
详细信息:编译器:x86-64 gcc 8.2
选项:-O3
void use()
{
int* ptr;
while (*ptr == 6);
}
Assembly:
use:
cmp DWORD PTR ds:0, 6
jne .L1
.L3:
jmp .L3
.L1:
ret
正如我们所见,编译器仍然生成无限循环。但是,如果我使用这个:
void use()
{
int p;
while (p == 6);
}
Assembly:
use:
ret
我希望它们都不会生成 while 循环。我的猜测是,对于第一个版本,由于我们不可能知道 ptr 指向什么,因此我们不能对 *ptr 做出任何假设。但是我们是否可以对第二个版本做出类似的论证,其中 p 只是一个局部变量,即 p 可以包含任何内容?
最佳答案
两个版本都有未定义的行为,因为您访问和读取未初始化的变量。因此,编译器可以生成任何代码。
关于c - 为什么 gcc 编译器在这两种情况下表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53445819/