char *str = "ESPA1";
printf("%s", str + str[0] - str[3]);
我知道输出为1,但我不明白为什么可以这样“切割”字符串的一部分。
首先让我们分解表达式:
str + str[0] - str[3]
插入str[0]
和str[3]
的值,我们得到:
str + 'E' - 'A'
假设字符以ASCII表示,与以下相同:
str + 69 - 65
现在,我们将使用一个快捷方式,并假设它与:
str + (69 - 65)
哪个给我们:
str + 4
哪个是指向数组元素索引4的指针,即字符'1'
。因此,printf
从那里开始读取,这就是打印的内容。
现在回到该快捷方式:
str + (69 - 65)
这不是实际计算的方式。加法和减法具有相同的优先级,并且从左到右分组,所以它的确是这样:
(str + 69) - 65
第一个子表达式生成一个指向索引69的指针,但是str
指向的字符串文字没有那么多元素。因此,由于我们要在数组末尾创建一个超过1个元素的指针,因此代码显示为undefined behavior。在这种情况下,您很幸运,它按预期运行。
看看这个:
char *str = "ESPA1";
printf("%s", str + 4);
C0]的[Ascii值为65,'A'
的值为69,因此减法得到4,您从基数'E'
引用了5th
元素,这当然是第一个元素的位置/引用。
要了解有关指针算术的更多信息:
str