Why is this snippet compilable in C?
Possible Duplicate:
In C arrays why is this true? a[5] == 5[a]
"zdvnngfgnfg"[ 3 ]; </P >
- checkout stackoverflow.com/questions/381542/…以及
它相当于
这是合法的,意思是"把那个字面上的地址加上3*sizeof(char)"。无论如何都没有效果。
也可以看到这个非常相似的问题。
- 这个意思不也包括"然后在那个地址取值"吗?
- 我想没有,因为声明既不在任务的左边也不在任务的右边。
- 因为片段是一个完整的表达式,所以实际上它的意思是"然后获取值"。但是,因为这样做没有定义的副作用,并且结果被丢弃,所以编译器可以忽略它。事实上,编译器可能也会省略指针添加——它所要做的就是确保语句合法,意识到它什么都不做,然后删除它。当然,这就是GCC所做的,即使没有优化。
- 在C语言中,作为表达式语句出现的表达式被转换为右值:访问其中的值。"除非它是sizeof运算符、一元运算符、++运算符、--运算符或的左操作数的操作数。运算符或赋值运算符,将没有数组类型的左值转换为存储在指定对象中的值"。行为与C++不同,如果没有请求读取,则没有取值。但是,当然,您不会注意到差异,因为数组不是易失性的:)
- 索引常量字符串可以使代码在转换为十六进制数字时看起来特别漂亮:char digit="0123456789abcdef"[i];
arr[i]被解析为*(arr+i),可以写成*(i+arr),因此i[arr]现在,"strngjwdgd"是指向存储在只读位置的常量字符数组的指针。所以它起作用了!!
字符串文字(array衰减为char*类型的指针。然后,我们来看看第四个元素:
1
| 3["zdvnngfgnfg"] =="zdvnngfgnfg"[3] |
号
为什么可以在数组前面写下标是另一个问题:
在C数组中,为什么是这样?