Gha*_*san 3 c arrays subscription
今天我遇到了这个博客.最吸引我的是这个:
int i;
i["]<i;++i){--i;}"];
Run Code Online (Sandbox Code Playgroud)
好吧,我真的不知道数组下标中奇怪的"字符串常量"的目的是什么,但我很困惑如何下标整数变量.所以我带来了这段代码:
#include <stdio.h>
int main(void) {
int x = 10;
printf("%d", x["\0"]); /* What is x["\0"]?! */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它使用MinGW和-Wall -ansi -pedantic编译时没有错误.然后该代码输出:105.
谁能解释这个?
编辑:我发现下标中必须有一个指针,否则我会得到编译时错误.
这是数组索引如何工作的结果:
给定一个数组:
int array[5];
Run Code Online (Sandbox Code Playgroud)
然后
array[3]
Run Code Online (Sandbox Code Playgroud)
真的只是另一种语法
*(array + 3)
Run Code Online (Sandbox Code Playgroud)
因此,这与
*(3 + array)
Run Code Online (Sandbox Code Playgroud)
这意味着您也可以
3[array]
Run Code Online (Sandbox Code Playgroud)
C11标准说明了这一点:
6.5.2.1,数组订阅
[...]
后缀表达式后跟方括号中的表达式
[]是数组对象元素的下标名称.下标操作符的定义[]是E1[E2]相同(*((E1)+(E2))).由于适用于binary +运算符的转换规则,ifE1是一个数组对象(等效地,指向数组对象的初始元素的指针)并且E2是一个整数,因此E1[E2]指定E2-th元素E1(从零开始计数).
注意:
E1[E2]是完全相同的(*((E1)+(E2)))
因此
E1[E2] = E2[E1]
Run Code Online (Sandbox Code Playgroud)
.此外,
6.4.5字符串文字
[...]
然后使用多字节字符序列初始化静态存储持续时间和长度的数组,该数组足以包含序列.对于字符串文字,数组元素具有类型
char
所以执行以下操作是有效的:
"foobar"[x];
x["foobar"];
Run Code Online (Sandbox Code Playgroud)