C编译器`-O0如何使代码变得如此疯狂?

问题描述 投票:0回答:1

请查看:https://godbolt.org/z/WGBP8D

代码:

    size_t n;
    scanf("%d", &n);
    fprintf(stderr, "(1 <= %d) == %d\n", n, 1 <= n);
    fprintf(stderr, "(%d <= 1000) == %d\n", n, n <= 1000);
    fprintf(stderr, "%d\n", 2 <= 1000);
    ASSERT(1 <= n && n <= 1000);

输入设置为:

2
1
2

输出:

(1 <= 2) == 1
(2 <= 1000) == 0
1
Assertion failed: 1 <= n && n <= 1000

注释掉另一部分代码将更改上面代码段的行为。怎么样?

有趣的是,启用任何优化(-O1)都很好,但是没有优化(-O0或未指定)...好吧,我什至不知道如何理解它。

c gcc
1个回答
4
投票

scanf仅影响64位n的低32位。 printf也只显示底部的32位,但是经过一些优化,顶部32位中有些东西,使得n大于1000,因此这行输出:

(2 <= 1000) == 0

-墙可能会警告您问题所在。

© www.soinside.com 2019 - 2024. All rights reserved.