当前位置: C语言 -- 专题 -- C语言中字符串字面量是不是常量?

C语言中字符串字面量是不是常量?

C语言中每个常量(constant)都是有类型的,常量的值应在其类型所能表示的范围内;字符串字面量(string literal)是双引号包含的连续字符或者转义序列;两者有个共同特点:值是不能改变的,那么字符串字面量是不是常量呢?接下来从三个角度讨论一下这个问题。


1、ISO/IEC 9899:2018标准的角度。

ISO/IEC 9899:2018标准词汇要素分类中,第6.4.4 Constants节是常量,第6.4.5 String literals节是字符串字面量,两者是并列关系。ISO/IEC 9899:2018标准第6.4.4 Constants节也明确指出了C语言中常量的4种形式,即整数常量、浮点常量、枚举常量、字符常量。因此从ISO/IEC 9899:2018标准的角度来看,字符串字面量不属于常量。


2、左值的角度。

字符串字面量是左值(lvalue),可以用作地址运算符(&)的操作数;常量不能用作地址运算符的操作数,例如:

printf("%p\n", &"a");   //合法。
printf("%p\n", &'a');   //非法。

3、值不能改变的原因。

ISO/IEC 9899:2018标准第6.4.5 String literals节对字符串字面量的值不能改变的原因作了解释,标准原文:It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.;对于相同值的字符串字面量,标准并没有指明是使用同一数组存储,还是分别使用不同数组存储;出于这种考虑,标准将试图修改字符串字面量的行为归为未定义行为(undefined behavior),例如:

char *ptrOne = "abc";
char *ptrTwo = "abc";

if(ptrOne == ptrTwo)
    ...

这里两个指针的值可能相等,也可能不相等;具体取决于实现。


综上所述,字符串字面量不是常量。