C 以下内容的输出

C 以下内容的输出,c,C,代码片段 int main(){ printf(5 + "GeeksQuiz"); return 0; } 输出是测验 你能告诉我这个输出是怎么来的吗。 背后的逻辑是什么 加法是交换的a+b等于b+a 将整数添加到指针会按照指针算术递增。将整数添加到指针时,指针的增量为整数计数的元素数。所以(int*)a+b等于(int*)((uintptpr_t)a+b*sizeof(int)) sizeof(char)始终等于1 “Geeksquick”是一个有趣的游戏strle

代码片段

int main(){
    printf(5 + "GeeksQuiz"); 
    return 0;    
}
输出是测验

你能告诉我这个输出是怎么来的吗。 背后的逻辑是什么

  • 加法是交换的<代码>a+b等于
    b+a
  • 将整数添加到指针会按照指针算术递增。将整数添加到指针时,指针的增量为整数计数的元素数。所以
    (int*)a+b
    等于
    (int*)((uintptpr_t)a+b*sizeof(int))
  • sizeof(char)
    始终等于1
  • “Geeksquick”
    是一个有趣的游戏
    strlen(“geeksquick”)
    等于9。考虑到以空字节结尾的字符串,文本的类型是
    char[10]
    。它是一个由10个字符组成的数组,内容
    {'G','e','e','k','s','Q','u','i','z','0'}
  • C规则说,在大多数上下文中,类型的数组被转换为指向该数组第一个元素的指针。这种情况发生在这里:
    (char[])“geeksquick”
    被转换成指向字符串中第一个字符
    'G'
    char*
    指针
  • 5+“geeksquick”
    将“geeksquick”
    转换为指向第一个字符的指针。然后该指针递增5。因此
    5+“geeksquick”
    的结果将是
    char*
    指针,该指针将指向字符串文本中的字符
    'Q'
  • printf
    打印作为第一个字符传递给它的以null结尾的字符串,但以
    %
    开头的转换除外,此处不适用
  • printf
    函数传递指针的地址,该指针指向
    “geeksquick”
    字符串文本中的字母
    'Q'
  • printf
    递增指针,直到找到以空字节结尾的字符串。因此,它将打印
    {'Q'、'u'、'i'、'z'}
    ,因为在
    z
    字符之后,它将找到空字节

  • printf
    打印
    *char
    类型的指针。添加5将打印指针+5。如果您将使用6,它将打印uiz。如果您使用的整数大于
    strlen()
    则您的应用程序将写无意义的内容。