为何初始化str为"face"的这段C代码输出结果为-99?
为什么这段C代码会输出-99?
咱们直接从代码里的关键表达式-2[str]入手拆解:
1. C语言数组下标运算符的交换律
在C语言中,数组下标运算符[]本质上是指针加法的语法糖,也就是说:
a[b] == *(a + b)
而加法是满足交换律的,所以*(a + b)又等价于*(b + a),对应到下标写法就是:
a[b] == b[a]
所以代码里的2[str]完全等价于str[2]——这看起来反直觉,但确实是C标准允许的合法语法(只是可读性极差,实际开发千万别这么写)。
2. 字符串"face"的字符ASCII值
char *str = "face"定义的字符串,在内存中是按顺序存储的字符数组:
str[0] = 'f',ASCII码为102str[1] = 'a',ASCII码为97str[2] = 'c',ASCII码为99str[3] = 'e',ASCII码为101
3. 计算表达式-2[str]的结果
结合上面两点,2[str]就是str[2],也就是字符'c'对应的ASCII值99。前面的负号会把这个整数取反,得到-99,最后printf("%d\n", ...)会把这个整数输出到控制台。
总结一下:这个输出完全是C语言指针运算特性和ASCII编码共同作用的结果,核心点就是数组下标的交换律特性。
内容的提问来源于stack exchange,提问作者tushar pahuja
相关产品推荐
相关产品推荐

