gpt4 book ai didi

用优化编译得到一个错误的条件

转载 作者:行者123 更新时间:2023-12-03 18:44:17 26 4
gpt4 key购买 nike

这段代码在循环终止条件中有一个错误。
但是,我仍然不明白编译器的决定——它似乎又一次进入了循环。

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
#define ARR_SIZE 25
int a[ARR_SIZE];
memset (a,1,sizeof(a)); /*filling the array with non-zeros*/

int i = 0;

for (i=0; (a[i] != 0 && i < ARR_SIZE); i++)
{
printf ("i=%d a[i]=%d\n",i,a[i]);
}
return 0;
}

使用 -O2 编译时或 -O3循环未按预期终止 - 它也打印一行何时 i == ARR_SIZE .
> gcc -O3  test_loop.c
> ./a.out
i=0 a[i]=16843009
i=1 a[i]=16843009
...
i=23 a[i]=16843009
i=24 a[i]=16843009
i=25 a[i]=32766 <=== Don't understand this one.

> gcc -O0 test_loop.c
> a.out
i=0 a[i]=16843009
i=1 a[i]=16843009
...
i=23 a[i]=16843009
i=24 a[i]=16843009
>

gcc 版本是这样的: gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
我在 gcc 4.4.7-18 上没有看到这种情况发生.

还有其他尺寸的 ARR_SIZE不会给出相同的结果。

最佳答案

i == ARR_SIZE您的情况将评估 a[i]调用UB

for (i=0; (a[i] != 0 && i < ARR_SIZE); i++)
// ^^^^ Undefined Behaviour
{
printf ("i=%d a[i]=%d\n",i,a[i]);
}

交换条件: for (... (i < ARR_SIZE && a[i] != 0) ...)利用“短路 bool 评估”。

关于用优化编译得到一个错误的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60362539/

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