我很偶然地看到了这个问题,它要求找出以下代码的输出结果 -
char abc[14] = "C Programming";
printf("%s", abc + abc[3] - abc[4]);
我真的不明白输出是怎么来的 - 编程,有人能解释一下吗?
虽然不太明显,但是代码展示了未定义行为。这是因为先进行了加法运算,导致指针超出了abc
的边界,这是未定义的行为,即使没有解引用也是如此。"正确"的方法应该先进行减法运算。
char abc[14] = "C Programming";
printf("%s", abc + (abc[3] - abc[4]));
abc[3]
和abc[4]
只是char
值'r'
和'o'
。它们可以像其他整型一样使用。 'r'
的值通常只是字符r
的ASCII值。abc + abc[3] - abc[4]
并不神奇,只是指针算术运算。abc + abc[3]
已经超出了索引范围,所以该代码无效。abc + abc[3]
形成指针是未定义行为,因为它并没有指向数组。然而,在实践中,它在所有明智的架构上都可以正常工作。 - Quentinabc[3] - abc[4] + abc
不会触发 UB。 - Quentinstd::numeric_limits<long long>::max + 10 - 11
。这就是一个例子。 - bolovabc
是abc[14]
数组的起始地址(即abc[0]
的地址)。
abc[3]
是数组中的第4个元素,即字符r
,abc[4]
是数组中的第5个元素,即字符o
。字符r
的ASCII值为114,字符o
的ASCII值为111,因此您需要将数组指针加上3(即114-111)。
您的输出应该是“rogramming”。
但是,正如评论中所述,这样做非常不好的编程风格,并且可能导致未定义的行为。
abc
指针(一个整数)、abc[3]
(一个整数)和abc[4]
(一个整数)。这个整数被推到 printf 调用的堆栈上。没有任何越界的数组引用。 - Kenney