c - C 程序中整数的奇怪行为

标签 c

编辑:感谢您提供上一个 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/

相关文章:

C - 从文件读取并将信息保存在变量上

java - 如何用 Java 或 C 监视/采样输出音频?

c - 在 C 中使控制台窗口变大

c - IOCCC 1988/isaak.c - 为什么即使在 ANSI 化之后也没有输出?

c - 将文件的每一行存储在 C 结构中,但忽略//之后的部分行

c - 从 C 到 Swift 的函数回调

c - 更好的做法是 strcpy() 或指向另一个数据结构?

c - 标签只能作为语句的一部分使用 Error

c - C程序中的ASM代码导致段错误

c - 插值搜索程序?