这段代码是如何在gcc中编译的,它实际上在做什么?

这段代码是如何在gcc中编译的,它实际上在做什么?,c,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]

在我的工作中,确实有人产生了一个代码,其简化如下:

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];
     ^
我也可以在叮当声上编译

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


编辑:它实际上不返回指针,而是返回一个整数(我错了)

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

如果3是一个函数,它将在不保留返回值的情况下执行,
但是3本身是不相关的(没有执行,3没有使用):这是第一个警告

第二,没有任何效果的表达。
在C(等等)中,您可以编写类似
1;它们只做有效(无用)代码。
a[4]没有不同,这就是第二个警告的原因

您可能在生成的汇编代码中找不到它的任何内容
(可能是带有C代码和行号的注释),因为没有任何内容
根本无法产生。编译器可以生成要加载的内容
a[4]

从内存中删除,然后不要使用它,但这很可能会被优化掉

我知道[3,4]返回一个指针,但这就是我所了解的

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


3,4
是一个带有逗号运算符的表达式,其计算结果为RHS,即4。因此,
a
数组用数字4进行索引。

可能的重复感谢您的评论,我会看一看。注意,另一方面使用是无效的。基本上与cy相同,但对于cy,您的同事应该被解雇这里涉及到lly指针,因为
a[3,4]
在上下文中本质上是
*(a+(3,4))
的语法糖(
a+(3,4)
肯定是指针)。