gpt4 book ai didi

c - 为什么 gcc 编译器在这两种情况下表现不同?

转载 作者:行者123 更新时间:2023-11-30 18:45:52 24 4
gpt4 key购买 nike

我有两个类似的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com