相关疑难解决方法(0)

GCC 删除了 && 右操作数中的边界检查,但没有删除左操作数中的边界检查,为什么?

我有以下 C/C++ 代码片段:

#define ARRAY_LENGTH 666

int g_sum = 0;
extern int *g_ptrArray[ ARRAY_LENGTH ];

void test()
{
    unsigned int idx = 0;

    // either enable or disable the check "idx < ARRAY_LENGTH" in the while loop
    while( g_ptrArray[ idx ] != nullptr /* && idx < ARRAY_LENGTH */ )
    {
        g_sum += *g_ptrArray[ idx ];
        ++idx;
    }

    return;
}
Run Code Online (Sandbox Code Playgroud)

当我使用版本 12.2.0 中的 GCC 编译器编译上述代码时,并选择-Os两种情况:

  1. while 循环条件是g_ptrArray[ idx ] != nullptr
  2. while 循环条件是g_ptrArray[ idx ] != …

c c++ arrays gcc compiler-optimization

32
推荐指数
3
解决办法
4196
查看次数

否定INT_MIN是否为不确定行为?

假设我有一个i来自外部来源的变量:

int i = get_i();
Run Code Online (Sandbox Code Playgroud)

假设iINT_MIN和的补码表示形式,是-i不确定的吗?

c c99 c89 undefined-behavior

3
推荐指数
2
解决办法
714
查看次数

找到一个值 y 这样 (x &lt; y) == (-x &gt; -y) 将是假的,当 x 是有符号整数并且 x=1 时?

问题问,

让 int x = 1,找到一个 int y 的值,其中以下语句将返回 false: (x < y) == (-x > -y)

我知道答案应该是 4 个字节长(8 个十六进制数字),但我不知道如何解决这个问题。

c

0
推荐指数
1
解决办法
266
查看次数

标签 统计

c ×3

arrays ×1

c++ ×1

c89 ×1

c99 ×1

compiler-optimization ×1

gcc ×1

undefined-behavior ×1