在我的工作中,有人确实生成了一个代码,该代码减少如下:
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汇编知识)。
编辑:它实际上不返回指针而是整数(我的错误)
答案 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。