问题 为什么在不可变的字符集可能的情况下不能使用一组不可变的整数?


char *str = "Hey baby";

为字符串和点创建内存 str 它。如果这是有效的,为什么不是以下内容:

int *x = {7, 0, 1};

除了它们之外,这应该做同样的事情 int而不是 char秒。


9430
2018-03-08 06:35


起源

那么你可以这样做:int x [] = {7,0,1};但是x是可变的。也, str 真的应该是:const char * str =“嘿宝贝”; - jschultz410
因为C标准对字符串文字给予特殊处理,因为它们是如此常见和有用,但对于一般数组文字没有这样的概念。 - jschultz410
这种“为什么”的问题很难客观地回答,因为只有语言的设计者才能给出明确的答案;其他人都会猜测。 - NPE
虽然对于一个刚接触某种语言的人来说,并不总是很清楚设计师是如此突发奇想,所以这些问题对于分离“它是神秘的,但这就是”从“没有人知道并且有没门”。 - Richard
这是另一个有趣的小说:char str [5] =“你好”;是合法的,并且不会有一个nul终结符:char str [6] =“Hello”;也是合法的,但会有一个终结者。 - jschultz410


答案:


有“一成不变的整体”,它看起来像:

(const int[]){7, 0, 1}

适当的术语是 复合字面量。你可以指出它:

const int *ptr = (const int[]){7, 0, 1};

由于历史原因,字符串文字没有 const 虽然是不可改变的类型。但是使用a是个好主意 const char * 指向它们,以便编译器在您尝试写入一个时检测到它。

复合文字与 const 类型可以以与字符串文字相同的方式“折叠”,即它们可以与其他这样的复合文字重叠。非const复合文字确实有唯一的地址,可以写入。


13
2018-03-08 06:47



那太漂亮了。什么时候被添加到C? - jschultz410
@ jschultz410 1999 - M.M
啊,显示我的年龄。 :P - jschultz410
@MattMcNabb对不起,我的问题是关于 c90 std 这仍然适用吗? - tomol
@tomol这在C90中是不可能的 - M.M


为什么在不可变的字符集可能的情况下不能使用一组不可变的整数?

原因是这样的陈述

int *x = {7, 0, 1};  

是违反约束。它取决于编译器如何处理它。

5.1.1.3诊断(P1):

如果预处理转换单元或转换单元包含违反任何语法规则或约束的情况,则符合的实现应生成至少一个诊断消息(以实现定义的方式标识),即使该行为也明确指定为未定义或实现 - 定义

在大多数情况下,编译器不会发出任何警告 -pedantic -Wall -Wextra 标志不用于编译。一个 GCC中的错误 报告此格式错误的初始化。

一组不可变的 int 可以使用创建 const 限定符为

int const x[] = {7, 0, 1};  

0
2018-03-08 12:00