我不明白为什么在此程序中输出为 nt
。
谁能解释这个程序?
#include <stdio.h>
#include <stdlib.h>
int main(){
printf(3+"excellent"+4); //output is "nt"
return 0;
}
最佳答案
"excellent"
是char[10]
类型的数组,其元素是单词的9个字母和结尾的'\0'
。然后C11 6.3.2.1p3,
即将其转换为指向字符串第一个字符(e
)的指针,然后具有char *
类型。
现在我们有两个补充:
(3 + (char *)"excellent") + 4
C标准说(简化后的C11 6.5.6p8),当将整数和指针加在一起时,结果将是相同类型的指针,并且将被解释为如果指针
p
指向数组的元素n
,则p + m
将产生一个指针,该指针将指向同一数组的元素n + m
,或者指向末尾的一个,或者,如果n + m
在数组的边界之外或指向末尾的一个,则行为未定义。IE。
3 + "excellent"
将提供一个指向e
的第二个字母excellent
的指针。现在当然了,因为带括号的表达式的类型为char *
,并且它指向数组的元素3,所以如果将其添加4,我们将得到一个指向元素7的指针,即第8个字母n
。 <-------------- char [10] -------------->
+---+---+---+---+---+---+---+---+---+---+
| e | x | c | e | l | l | e | n | t | \0|
+---+---+---+---+---+---+---+---+---+---+
^ ^ ^
| | |
first character, "excellent" after lvalue conversion
| |
+ 3 + "excellent"
|
+ 3 + "excellent" + 4
现在最后,当我们调用
printf
给出这样的指针作为参数时,会发生什么? printf
将认为该参数是指向以null终止的字符串(格式字符串)的第一个字符的指针。除了以%
开头的特殊序列之外,所有字符都逐字复制到输出中,直到遇到终止null为止。研究这些问题的另一种方法是记住
*(a + b)
等于
a[b] (or even b[a])
并且由于
&*x
与x
等效,&*(a + b) == (a + b) == (b + a) == &a[b] == &b[a]`
我们得到了
3 + "excellent" + 4
等于
&"excellent"[3] + 4
等于
&"excellent"[3 + 4]
IE。
&"excellent"[7]
关于c - 这行的printf(3 +"excellent"+4)如何运行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58982070/