【问题标题】:Why no immutable set of ints while immutable set of chars is possible?为什么没有不可变的整数集,而不可变的字符集是可能的?
【发布时间】:2015-05-09 12:50:34
【问题描述】:
char *str = "Hey baby";

为字符串创建内存并将str 指向它。如果这是有效的,为什么不如下:

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

这应该做同样的事情,除了他们是ints 而不是chars。

【问题讨论】:

  • 你可以这样做: int x[ ] = { 7, 0, 1 };但 x 是可变的。另外,str 真的应该是: const char *str = "Hey baby";
  • 因为 C 标准对字符串字面量进行了特殊处理,因为它们是如此常见和有用,但对于一般的数组字面量则不存在这样的概念。
  • 这种“为什么”的问题很难客观地回答,因为只有语言的设计者才能给出明确的答案;其他人都会猜测。
  • 虽然对于刚接触一门语言的人来说,并不总是清楚是设计师的心血来潮,所以这些问题对于区分“它很神秘,但这就是如何”很有价值从“没有人知道,也没有办法”。
  • 这是另一个有趣的花絮:char str[5] = "Hello";是合法的,不会有 nul 终止符 while: char str[6] = "Hello";也是合法的,但会有一个 nul 终止符。

标签: c string pointers char integer


【解决方案1】:

有“不可变的整数集”,它看起来像:

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

正确的术语是复合文字。你可以指向它:

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

由于历史原因,字符串文字虽然是不可变的,但没有const 类型。但最好使用const char * 指向它们,这样编译器就会检测到您何时尝试写入。

const 类型的复合文字可以像字符串文字一样“折叠”,即它们可能与其他此类复合文字重叠。非常量复合文字确实具有唯一的地址,并且可以写入。

【讨论】:

  • 这很好。什么时候添加到 C 中的?
  • @MattMcNabb 抱歉,我的问题是关于 c90 std 这仍然成立吗?
  • @tomol 这在 C90 中是不可能的
【解决方案2】:

为什么没有不可变的整数集,而不可变的字符集是可能的?

原因是这样的语句

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

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

5.1.1.3 诊断(P1):

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

在大多数情况下,如果不使用-pedantic -Wall -Wextra 标志进行编译,编译器不会发出任何警告。针对此格式错误的初始化报告了 bug in GCC

int 的不可变集合可以通过使用 const 限定符 as 来创建

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

【讨论】:

    猜你喜欢
    • 2016-10-02
    • 2011-12-23
    • 2016-09-28
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2012-01-19
    • 2011-03-11
    相关资源
    最近更新 更多