为什么这段代码在gcc中编译,它实际上在做什么?

时间:2014-12-10 13:01:28

标签: c

在我的工作中,有人确实生成了一个代码,该代码减少如下:

int main()
{
    int a[20];
    a[3, 4];
    return 0;
}

a [3,4]编译没有错误,默认gcc选项没有警告。使用gcc -Wall选项,它会产生以下警告:

test.c: In function ‘main’:
test.c:4:8: warning: left-hand operand of comma expression has no effect [-Wunused-value]
     a[3, 4];
        ^
test.c:4:5: warning: statement with no effect [-Wunused-value]
     a[3, 4];
     ^

我也可以在clang上编译。

基本上,我不明白为什么要编译? 它实际上在做什么(我知道[3,4]返回指针,但这是我所理解的)。我试图用-S gcc选项查看汇编代码,但我真的不了解它的输出(缺乏x86汇编知识)。

编辑:它实际上不返回指针而是整数(我的错误)

2 个答案:

答案 0 :(得分:4)

首先,逗号运算符:它评估每个部分,但只“返回”最后一个部分 a[3,4]a[4]相同。

如果3是一个函数,它将在不保留返回值的情况下执行,
但是单独的3是无关紧要的(没有执行任何执行,3没有使用):这是第一个警告。

其次,表达没有任何影响。
在C(等)中,您可以编写1;之类的内容;他们什么也不做,只是有效(无用)的代码 a[4];没有什么不同,这是第二次警告的原因。

您可能无法在生成的汇编程序代码中找到任何内容 (可能是C代码和行号的评论),因为没有任何内容 生成所有。编译器可以生成要加载a[4]的内容 从内存中不要使用它,但这很可能会被优化掉。

答案 1 :(得分:2)

  

我知道[3,4]返回一个指针,但这是我理解的全部

不。这里根本没有涉及指针,a[3, 4没有“返回”任何东西。

3, 4是一个带有逗号运算符的表达式,其值为4,因此,a数组的索引编号为4。