c程序中整数的奇怪行为

时间:2014-06-02 18:56:14

标签: 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!
}

那么......到底是怎么回事?!我宣布"我"作为一个整数,然后我将它视为一个没有编译错误/警告的数组,我输入一个字符串作为数组的参数,仍然没有问题?有人有主意吗?提前谢谢。

2 个答案:

答案 0 :(得分:3)

字符可以隐式转换为整数。

您看到的数字对应于字符编码中使用的位数。在这种情况下,看起来字符是以ascii编码的,它给出了这些特定的小数。 http://en.wikipedia.org/wiki/ASCII如果您在其中查找ab的代码,您会看到相应的十进制代表:a=97 b=98

当您在main之外写int i时,它会被初始化为0(我不完全确定C标准是否要求,我现在只是查看它,但无论如何,许多编译器都会这样做)。然后,当您撰写i["a"]时,这相当于0["a"],而*(0 + "a")依次为"a"[0]"a"。当您在代码中定义类似"a"[0]的内容时,您将获得string literal,这意味着它是指向char的指针。因此char只是"a"数组a的第一个字符,它只是字符'a'。如果字符97由97表示,那么当您获取整数表示时,将获得{{1}}作为结果。

答案 1 :(得分:3)

是的,这实际上是有效的C,正如迈克尔在评论中提到的那样。 array[1]相当于*(array + 1),相当于1[array]

在您的情况下,i["a"]相当于0["a"],相当于"a"[0] "a"。当然,97是'小写a'的ASCII。

更多关于C的索引运算符:http://boredzo.org/pointers/#indexing

顺便说一下,如果你正在使用gcc或clang,你可以使用-Wall -Wextra -pedantic编译你的代码来查看所有编译器警告(而不是你讨价还价,我认为)。