有人可以解释为什么printf(“%s”,str + str [0]-str [3]);在C语言中可以使用?

问题描述 投票:1回答:2
char *str = "ESPA1";
printf("%s", str + str[0] - str[3]);

我知道输出为1,但我不明白为什么可以这样“切割”字符串的一部分。

c c-strings
2个回答
5
投票

首先让我们分解表达式:

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。在这种情况下,您很幸运,它按预期运行。


3
投票

看看这个:

char *str = "ESPA1";
printf("%s", str + 4); 

C0]的[Ascii值为65,'A'的值为69,因此减法得到4,您从基数'E'引用了5th元素,这当然是第一个元素的位置/引用。

要了解有关指针算术的更多信息:

str

Pointer Arithmetic

© www.soinside.com 2019 - 2024. All rights reserved.