数组的字符串文字

String literals for array

#include <stdio.h>

int main(void) {
    char a[] = "125"; // (int)1, (int)2, (int)5. But array 'a' has a type char. So int is in char. ???
    printf("%s", a);
}

在该代码中,字符串文字的每个元素都是 int 类型。但是数组 a 的类型为 char.

在 C99 6.4.5 $2 片段
相同的考虑适用于字符串中序列的每个元素 文字或宽字符串文字,就好像它在整数字符常量或宽字符串中一样 字符常量

在 C99 6.4.5 $5 片段中
对于字符串文字,数组元素有 类型为 char,并使用多字节字符的各个字节进行初始化 sequence

我觉得他们不兼容,这对我来说是矛盾的。我的想法有什么问题吗?

不,这是一个字符串文字。

引用 C11,第 6.4.5 章,字符串文字:

A character string literal is a sequence of zero or more multibyte characters enclosed in double-quotes, as in "xyz".[...]

具体来说,字符串 liteal 可接受的语法是:

string-literal:
                 encoding-prefixopt " s-char-sequenceopt "
          encoding-prefix:
                 u8
                 u
                 U
                 L
          s-char-sequence:
                 s-char
                 s-char-sequence s-char
          s-char:
                 any member of the source character set except
                              the double-quote ", backslash \, or new-line character
                 escape-sequence

然后,“源字符集”,参考(Chapter 5.2.1/P3)

Both the basic source and basic execution character sets shall have the following members: the 26 uppercase letters of the Latin alphabet

         A   B   C   D   E   F   G   H   I   J   K   L   M
         N   O   P   Q   R   S   T   U   V   W   X   Y   Z
the 26 lowercase letters of the Latin alphabet
         a   b   c   d   e   f   g   h   i   j   k   l   m
         n   o   p   q   r   s   t   u   v   w   x   y   z
the 10 decimal digits
         0   1   2   3   4   5   6   7   8   9
the following 29 graphic characters
         !   "   #   %   &   '   (   )   *   +   ,   -   .   /   :
         ;   <   =   >   ?   [   \   ]   ^   _   {   |   }   ~

所以,像 "123" 这样的结构是一个字符串文字,而不是持有的单个整数 by/in char.

char a[] = "125"; 

In that code, each element of string literal has type int. But the array a has type char.

不,它是 5 并不意味着它必须是 int。其类型必须由声明的 where/how 上下文确定。

在你的例子中,5char 类型,因为它是字符串文字的一部分。

另请注意,5 可以是任何其他类型之一,例如 unsigned intunsigned shortdouble 等。因此您必须再次查看它的情况首先声明。