我不小心偶然发现了这个问题,该问题说明了以下代码的输出 -
char abc[14] = "C Programming";
printf("%s", abc + abc[3] - abc[4]);
我真的不明白输出是如何产生的 - rogamming 有人可以解释一下吗?
答案 0 :(得分:5)
这是非常微妙的,但代码表现出未定义的行为。这是因为首先完成添加,导致指针超出abc
的范围,这是未定义的行为,即使没有取消引用。 "正确"方法是先做减法。
char abc[14] = "C Programming";
printf("%s", abc + (abc[3] - abc[4]));
即便如此,结果也不会一成不变,因为无法保证ASCII编码用于字符。但由于ASCII无处不在,我们将忽略它。
其他答案解释了代码背后的黑魔法,所以我不会在这里重复。
答案 1 :(得分:2)
abc[3]
和abc[4]
只有char
个值'r'
和'o'
。它们可以像其他整体类型一样使用。 'r'
的值(通常)只是字符r
的ASCII值。
所以abc + abc[3] - abc[4]
不是神奇的,它只是指针算法。
但是,在此代码abc + abc[3]
已经超出索引范围,因此代码无效。
答案 2 :(得分:2)
abc
是abc[14]
数组的起始地址(abc[0]
的地址)。
abc[3]
是数组中的第4个条目,即字符r
,abc[4]
是数组中的第5个条目,即字符o
。 r
的ascii值为114,o
的ascii值为111,因此您向数组指针添加114-111 = 3。
你的输出应该是" rogramming"
但是 - 如评论中所述 - 它的风格非常糟糕,也可能是未定义的行为。