【问题标题】:What is meant by char temp[3]="";?char temp[3]=""; 是什么意思?
【发布时间】:2013-07-21 08:07:36
【问题描述】:

通常在C++中,字符数组的初始化方式如下,

char example[5]="cat";

如果你用""(只是一个没有空格的双引号)初始化它呢?
初始化后字符数组中的元素是什么?

【问题讨论】:

  • @trojanfoe 不,这只会告诉他第一个字符是'\0'。剩下的呢?
  • @LuchianGrigore 调试器不限于显示第一个字符。
  • @trojanfoe:很多 C++ 行为未定义或实现已定义;在一个平台上尝试,编译器不一定会告诉你在其他平台上会发生什么行为。因此,“试一试”的方法通常不是一种可靠的方法。
  • @trojanfoe 调试器可以在第一个字符之后放置任何字符,但这不是规则。在谈论 C++ 时,它并不像一直说“试试看你会看到”那么简单。这是调试器弊大于利的情况之一,因为它可能会欺骗你——你不能基于它做出任何假设。
  • @trojanfoe:如果我知道我会发布答案。但是,重要的是,你无法判断仅通过编译它并检查程序的行为来判断它是否定义良好。

标签: c++ arrays


【解决方案1】:

声明

char    temp[3] = "";

一样
char    temp[3] = {0};
                  // `\0` ascii value is 0

记住用0初始化的半个初始化数组的剩余元素。

Point :char temp[3] = "" 容易 type(表示写作),所以它更可取。

甚至将它与char temp[3] = {'\0'}; 的声明进行比较(它需要更多的字符来type)而char temp[3] = ""; 很简单(甚至没有类型不匹配 - int/char)。

【讨论】:

  • 甚至和char temp[3] = {};一样
  • = {} 将所有元素设置为默认值。对于整数,它是 0。
  • @GrijeshChauhan:您将其编译为 C。我对 C 的了解不如 C++,尤其是在涉及数组时,其中存在一些差异,尤其是自 C99 以来。但是,如果您在 C++ 中尝试这样做,正如我所说,它绝对不是标准的。我对 GCC 的扩展一无所知。我总是用-pedantic-errors 编译来执行标准。也许阅读this。虽然我不确定这是否是这里使用的,因为它说它们只能用作结构的最后一个成员。
  • @GrijeshChauhan:即使您添加了-pedantic-errors 标志,它也会编译?
  • @GrijeshChauhan: char str[7] = "grijesh"; 是 C 中的一个特例;它为您提供了一个不包含以 null 结尾的字符串的数组。 C++ 没有这种特殊情况,C++ 编译器应该拒绝它。您通常应该让编译器计算字符数:char str[] = "grijesh";(计算机真的非常擅长计算事物,所以您不必这样做!)。如果你想留下额外的空间,你可以指定长度:char str[80] = "grijesh";
【解决方案2】:

这是一个 3 字符数组,初始化为三个空字符。

编辑(在下面的 cmets 之后):

来自 K&R:

如果数组的初始值设定项少于指定数量,则外部、静态和自动变量的缺失元素将为零。

...

字符数组是初始化的一种特殊情况;可以使用字符串代替大括号和逗号表示法:

字符模式[] = "ould";

是更长但等效的简写

字符模式[] = { 'o', 'u', 'l', 'd', '\0' };

来自draft copy of the C++ standard, section 8.5.2, Character arrays

"1. char 数组(无论是plain char、signed char 还是unsigned char)、char16_t 数组、char32_t 数组或 wchar_t 数组可以由窄字符文字、char16_t 字符串文字、char32_t 字符串文字或宽字符初始化字符串字面量,或用括号括起来的适当类型的字符串字面量。字符串字面量值的连续字符初始化数组的元素。[示例:

char msg[] = "第 %s 行语法错误\n";

显示一个字符数组,其成员使用字符串文字进行初始化。请注意,因为 '\n' 是单个字符,并且因为附加了尾随 '\0',所以 sizeof(msg) 为 25。 — 结束示例]

...

“3.如果初始化器的数量少于数组元素的数量,则每个未显式初始化的元素都应进行零初始化(8.5)。”

【讨论】:

  • 是三个空字符还是只是第一个空字符?编辑:刚刚测试过,你是对的
  • 全部都是。 “如果初始化程序提供的元素太少,则其余数组元素假定为 0。” [Stroustrup,“C++ 编程语言”] 另外,请注意通过测试来确定 C++ 行为——不仅编译器之间存在不同的行为,而且一组可能的未初始化数据全为零。
  • @AndyThomas:这真的适用于字符串形式还是仅适用于大括号初始值设定项形式?我一直认为temp[3] = ""; 只初始化第一个字符,而temp[3] = {0}; 初始化所有字符。
  • 你得到了我的支持,因为我指出了标准中它说剩余元素是零初始化的。我没想到会这样。
  • +1。感谢您挖掘对字符串和大括号初始化之间等价性的引用。
【解决方案3】:

您将第一个元素设置为空终止字符。其他元素部分初始化为零:C and C++ : Partial initialization of automatic structure

【讨论】:

  • 如果有人要标记答案,他们至少可以有礼貌地解释原因!
  • @harper,请解释为什么?这是另一个参考:stackoverflow.com/questions/11780809/…
  • 它是一个数组而不是一个结构体。
  • @NeilKirk,我明白你的意思,但功能是一样的。请参阅此处的“初始化和字符串”:- poeticcoding.com/main/c-programing/…
  • 当你第一次写答案时,你说其他元素没有初始化。我没有注意到你已经编辑了它。
【解决方案4】:

一个空字符串。第一个字符将是空终止符。经过实验,剩余字符似乎设置为 0(这也是空终止符)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多