Tim*_*Tim -3 c literals string-literals
字符串文字是左值,它打开门以修改字符串文字.
来自C in a Nutshell:
在C源代码中,文字是表示固定值的标记,可以是整数,浮点数,字符或字符串.文字的类型由其值和符号决定.这里讨论的文字不同于C99标准中引入的复合文字.复合文字是普通的可修改对象,类似于变量.
虽然 C不严格禁止修改字符串文字,但您不应尝试这样做.首先,编译器将字符串文字视为常量,可将其置于只读存储器中,在这种情况下,尝试的写操作会导致错误.另一方面,如果程序中使用了两个或多个相同的字符串文字,编译器可能会将它们存储在同一位置,因此当您访问另一个时,修改它会导致意外结果.
第一段说"C中的字面值表示固定值".
这是否意味着不应修改文字(复合文字除外)?
由于字符串文字不是复合文字,是否应修改字符串文字?
这两段是否相互矛盾?我怎么理解他们?
可以修改既不是复合文字也不是字符串文字的文字?
来自C标准(6.4.5字符串文字)
7如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.
至于你的陈述.
第二段说"编译器不会严格禁止修改字符串文字".那么字符串文字应该被修改吗?
然后编译器不会修改字符串文字.它们可以将相同的字符串文字存储为一个数组.
正如@ o11c在附件J评论指出(资料)可移植性问题有书面
J.5常用扩展
1以下扩展在许多系统中广泛使用,但不能移植到所有实现.包含任何可能导致严格符合程序无效的扩展会导致实现不一致.此类扩展的示例包括新关键字,标准标头中声明的额外库函数或名称不以下划线开头的预定义宏.
J.5.5可写字符串文字
1字符串文字是可修改的(在这种情况下,相同的字符串文字应表示不同的对象)(6.4.5).
不要修改字符串文字.把他们视为char const[].字符串文字是有效的char const[](修改它们导致未定义的行为),但由于遗留原因它们确实存在char [],这意味着编译器不会阻止您写入它们,但如果您这样做,您的程序仍将是未定义的.