编辑:感谢您提供上一个 StackExchange 问题的链接,答案是 a[b] 定义为 *(a+b),使得“a”[0] = 0[“a”] = *(“a”+0)。我想这有效是因为“a”是一个指针?所以我不能说:
int i;
i[0];
但我可以说:
int i;
i["a"];
我试图了解这段代码到底是如何编译的以及发生了什么。任何提示将不胜感激。另外,如果您知道有助于理解 C 语言实际情况的良好引用资料,请随时将其交给我。
代码在这里:
int i;
main()
{
int j;
int k;
j=i["a"]; //printf says j is 97!
k=i["b"]; //printf says k is 98!
}
所以...到底发生了什么事?我将“i”声明为整数,然后将其视为没有编译错误/警告的数组,并且输入一个字符串作为数组的参数,仍然没有问题?有人有主意吗?提前致谢。
最佳答案
是的,正如 Michael 在评论中提到的,这实际上是有效的 C。 array[1]
相当于 *(array + 1)
,而 *(array + 1)
相当于 1[array]
。
就您而言,i["a"]
相当于 0["a"]
相当于 "a"[0]
是“a”
。当然,97 是 ASCII 的“小写 a”。
有关 C 索引运算符的更多信息,请参见:http://boredzo.org/pointers/#indexing
顺便说一句,如果您使用 gcc 或 clang,您可以使用 -Wall -Wextra -pedantic
编译代码以查看所有编译器警告(而不是超出您的预期,我认为)。
关于c - C 程序中整数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24001377/