我不明白为什么在此程序中输出为 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])

并且由于&*xx等效,
&*(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/

10-11 21:32