在采访中询问指针算术输出

shi*_*tra -3 c string

char s[] = "arista2015";
char *p = s;
printf("%s",p+p[4]-p[1]);
Run Code Online (Sandbox Code Playgroud)

该程序将输出作为

ista2015

有人可以解释输出吗?

Lyn*_*ynn 7

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'是连续的.

  • 正确 - 假设平台使用ASCII作为执行字符集. (3认同)

M.M*_*M.M 5

由于加法运算符是左右关联的,因此关键表达式是:

(p + p[4]) - p[1]
Run Code Online (Sandbox Code Playgroud)

而不是p + (p[4] - p[1])其他答案/评论的建议.由于p + p[4]远远超出了界限s,这会导致未定义的行为,这意味着任何事情都可能发生(包括但不限于任何特定的输出).