我有两个类似的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可以包含任何东西?
答案 0 :(得分:2)
两个版本都有未定义行为,因为您可以访问和读取未初始化的变量。因此,编译器可以生成任何代码。