#include <stdio.h>
int main()
{
printf("%s", (1)["abcd"]+"efg"-'b'+1);
}
有人可以解释为什么此代码的输出是:
fg
我知道(1)["abcd"]
指向"bcd"
但为什么+"efg"-'b'+1
甚至是有效的语法?
关于其他两个答案之间的差异似乎有些困惑。这是逐步发生的情况:
(1)["abcd"]+"efg"-'b'+1
第一部分,(1)["abcd"]
利用C中处理数组的方式。让我们看一下以下内容:
int a[5] = { 0, 10, 20, 30, 40 };
printf("%d %d\n", a[2], 2[a]);
输出将是20 20
。为什么?因为数组的名称int
求值为其地址,并且其数据类型为的指针int
。引用整数数组的元素会告诉C向数组的地址添加一个偏移量,并将结果评估为type int
。但这意味着C不在乎顺序:a[2]
与完全一样2[a]
。
同样,由于a
是数组a + 1
的地址,因此是元素在数组中第一个偏移处的地址。当然,这等效于1 + a
。
C中的字符串只是表示type数组的另一种人类友好方法char
。所以(1)["abcd"]
是相同的,在所述第一偏移的元件返回到字符数组a
,b
,c
,d
,\0
...这是字符b
。
在C语言中,每个字符都有一个整数值(通常是其ASCII码)。的值b
恰好是98。因此,评估的其余部分包括使用整数和一个数组进行计算:字符串"efg"
。
我们有字符串的地址。我们加减98(字符的ASCII值b
),然后加1。b
相互抵消,因此最终结果比字符串中第一个字符的地址多一个。性格f
。
将%s
在转换printf()
告诉C治疗的地址作为一个字符串的第一个字符,直到它遇到末尾的空字符打印整个字符串。
这样就打印出来了fg
,这是"efg"
从处开始的字符串的一部分f
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句