数组的字符串文字
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 上下文确定。
在你的例子中,5
是 char
类型,因为它是字符串文字的一部分。
另请注意,5
可以是任何其他类型之一,例如 unsigned int
、unsigned short
、double
等。因此您必须再次查看它的情况首先声明。
#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 上下文确定。
在你的例子中,5
是 char
类型,因为它是字符串文字的一部分。
另请注意,5
可以是任何其他类型之一,例如 unsigned int
、unsigned short
、double
等。因此您必须再次查看它的情况首先声明。