繁体   English   中英

下面的C编程语言是什么意思?

[英]What does the following mean apropos C programming language?

一本关于 C 编程的书说,

“不幸的是,还有另一类只读对象不受其类型的保护而不会被修改:字符串文字。

要点 - 字符串文字是只读的。

如果今天引入,字符串文字的类型肯定是 char const[],一个 const 限定字符数组。 不幸的是,const 关键字被引入 C 语言的时间比字符串文字晚得多,因此它保持不变是为了向后兼容。”

问题 1. 如果字符串可以修改,如何像外卖说的那样只读?

问题 2。“不幸的是,还有另一类只读对象不受其类型保护而不会被修改:字符串文字。”

这指的是什么类型,它不会阻止字符串文字被修改?

问题 3. 如果今天引入了字符串文字并具有 char const[] 类型,那么它们将如何成为一个数组,即我无法理解字符串文字将如何成为 const 限定字符的数组?

如果可以修改字符串,如何像外卖所说的那样只读?

因为Unfortunately, the const keyword was introduced to the C language much later than string literals, and therefore it remained as it is for backward compatibility

在语言中存在保护(以const关键字的形式)之前存在字符串文字。

因此,它们不受保护,因为不存在保护它的工具。 未定义行为的典型示例是写入字符串文字,请参阅未定义、未指定和实现定义的行为

这指的是什么类型,它不会阻止字符串文字被修改?

它的类型为char[N] - “N 个char的数组” - 其中N是字符串中的字符数加上零终止字符加一。

请参阅https://en.cppreference.com/w/c/language/string_literal

char *str = "string literal";
      // ^^^ - implicit decay from `char [N]` -> `char *`
str[0] = 'a'; // compiler will be fine, but it's invalid code

// or super shorter form:
"string literal"[0] = 'a'; // invalid code

如果今天引入了字符串文字并具有 char const[] 类型,那么它们将如何成为一个数组,即我无法理解字符串文字将如何成为 const 限定字符的数组?

类型将是const char[N] - N 个常量char的数组,这意味着您不能修改字符。

// assuming string literal has type const char [N]

const char *str = "string literal";
            // ^^^ - implicit decay from `const char [N]` -> `const char *`
str[0] = 'a'; // compile time error

// or super shorter form:
"string literal"[0] = 'a'; // with `const char [N]` would be a compiler time error

使用 gcc 编译器使用-Wwrite-strings来防止错误,例如写入字符串文字。

问题 1. 如果字符串可以修改,如何像外卖说的那样只读?

文本没有说它们可以修改。 它说它们不受保护而不会被修改。 这是一个小错误; 正确地,应该说它们不受保护以防止尝试修改它们:C 标准的规则不会阻止您编写尝试修改字符串文字的代码,并且它们不会在程序执行此类尝试时定义结果. 在某些情况下,尝试修改字符串文字可能会产生一个信号,通常默认情况下会结束程序执行。 在其他情况下,尝试可能会成功,并且字符串文字将被修改。 在其他情况下,什么都不会发生; 字符串文字既没有信号也没有变化。 也可能发生其他行为。

问题 2。“不幸的是,还有另一类只读对象不受其类型保护而不会被修改:字符串文字。”

这指的是什么类型,它不会阻止字符串文字被修改?

从技术上讲,字符串文字是一段源代码,在引号内有一个字符序列,可以选择带有编码前缀。 在编译或程序执行期间,会生成一个包含字符序列内容和终止 null 字符的数组。 对于没有前缀的字符串文字,该数组的类型是char [] (如果有前缀,则类型也可能是wchar_t []char16_t []char32_t ,具体取决于前缀。)

通俗地说,我们经常将此数组称为字符串文字,即使该数组是由字符串文字(内存中的数组)而不是实际的字符串文字(在源代码中)产生的东西。

char []类型不包含const ,因此它不提供const char []提供的保护。 (这些保护相当温和。)

问题 3. 如果今天引入了字符串文字并具有 char const[] 类型,那么它们将如何成为一个数组,即我无法理解字符串文字将如何成为 const 限定字符的数组?

你在这里的困惑是不清楚的。 当字符串文字出现在源代码中时,编译器会将其内容安排在正在运行的程序的 memory 中。 这些内容在 memory 中作为字符数组。 如果 C 的规则不同,则该数组的类型将是const char []而不是char []

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM