char s[] = "arista2015";
char *p = s;
printf("%s",p+p[4]-p[1]);
Run Code Online (Sandbox Code Playgroud)
该程序将输出作为
ista2015
有人可以解释输出吗?
p[4]等于't'.它的ASCII码是116.
p[1]等于'r'.它的ASCII码是114.
因此 编辑:马特的答案带来了一个很好的点-外面的字符串是不确定的行为,也因此指针运算p+p[4]-p[1]IS p+2,即2个字节过去这里p所指:p+116-114,并p+2不能真正保证是同样的事情.
'a' 'r' 'i' 's' 't' 'a' '2' '0' '1' '5' '\0'
^ ^
p p+2
Run Code Online (Sandbox Code Playgroud)
有趣的是,这是不确定的行为!在EBCDIC系统上,它会打印一个空字符串,就像那样't' - 'r' == 10(是的,真的).C99标准只保证对应的十进制数字代码'0','1','2'... '9'是连续的.
由于加法运算符是左右关联的,因此关键表达式是:
(p + p[4]) - p[1]
Run Code Online (Sandbox Code Playgroud)
而不是p + (p[4] - p[1])其他答案/评论的建议.由于p + p[4]远远超出了界限s,这会导致未定义的行为,这意味着任何事情都可能发生(包括但不限于任何特定的输出).