char s[] = "arista2015";
char *p = s;
printf("%s",p+p[4]-p[1]);
该程序的输出为
ista2015
有人可以解释一下输出吗?
请您参考如下方法:
p[4]
等于't'
。它的ASCII码是116。
p[1]
等于'r'
。它的ASCII码是114。
因此 编辑:马特的回答提出了一个非常好的观点——字符串之外的指针算术也是未定义的行为,所以p+p[4]-p[1]
是 p+2
,即 p
过去 2 个字节指向:p+116-114
和 p+2
实际上并不能保证是同一件事。
'a' 'r' 'i' 's' 't' 'a' '2' '0' '1' '5' '\0'
^ ^
p p+2
有趣的是,这是undefined behavior , 尽管!在EBCDIC上系统,它会打印一个空字符串,如 't' - 'r' == 10
(是的,确实如此)。 C99标准只保证十进制数字对应的代码'0'
、'1'
、'2'
...'9'
是连续的。