使用引号和花括号初始化字符数组

4

我有点困惑。这些代码在逻辑上有什么区别?

#include <iostream>
using namespace std;
int main(){
    char a[5]="ABCD"; // this
    cout << a;
    return 0;
}

第二个是:
char a[5]={"ABCD"}; // this

第三点是:
char a[5]={'A','B','C','D'}; // this

相关链接:https://dev59.com/c3vaa4cB1Zd3GeqPKPkD#21482059(特别是关于第二段代码) - anatolyg
2个回答

6
char a[5]={"ABCD"};
char a[5]={'A','B','C','D','\0'};

在这两种情况下,字符数组a被声明为 char 类型的 5 个元素大小:组成单词"ABCD"的 4 个字符,再加上一个最终的空字符('\0'),它指定了序列的结尾,在第二种情况下,使用双引号(")时会自动添加。注意通过逗号分隔添加空字符。用双引号("")括起来的一系列字符称为字符串常量。C 编译器可以自动在字符串常量的末尾添加空字符'\0'以表示字符串的结尾。
来源:此链接可帮助您更好地理解。

为什么第三个方法不会自动添加空字符?或者为什么前两个方法会自动添加空字符? - Asif Mushtaq
1
据我所知,编译器知道在使用引号组合数组时添加NULL - NewCoder
我知道,但为什么编译器不在第三个方法中添加空值?有任何逻辑吗? - Asif Mushtaq
在我看来,第三种方法是逐个查看数组元素,以指示“NULL”。 - NewCoder
1
字符串字面量根据定义以NULL结尾。由逗号分隔的四个字符集只是一堆数据,编译器不知道它们意味着要成为一个字符串。 - patros
patros大佬,您好啊!@NewCoder不好意思打扰您了,我有点困惑。 - Asif Mushtaq

0

前两个是将char[5]源分配给一个具有不同语法的char[5]数组。(5是四个字母加上一个空终止符)

最后一个也会做同样的事情,但它没有明确指定空终止符。由于你正在分配给一个char[5],最后一个仍然会用零填充剩余的空间,有效地添加一个空终止符并起到相同的作用,但如果你分配给一个char[4],最后一个不会抛出编译器错误;它只会留下一个未终止的字符数组。


为什么第三个方法不会自动添加空字符?或者为什么前两个方法会自动添加空字符? - Asif Mushtaq
@AsifMushtaq 这个答案说第三个确实添加了空字符 - 问为什么它没有添加是不正确的! - anatolyg
@anatolyg,我刚刚问了这个问题,为什么编译器不会自动添加空字符?char a[5] = {'A','B','C','D','\0'};有什么逻辑? - Asif Mushtaq
为什么太阳不发光?这是错误的问题:太阳确实会发光。为什么编译器在 char a[5]={'A','B','C','D'} 中不添加0?这也是错误的问题:编译器确实会添加它。抱歉使用了这个比喻,希望现在清楚了。 - anatolyg
只是在第三种情况下,空终止符实际上并不来自字符串字面值,它只是存在于缓冲区中填充零的额外空间中。 - mukunda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接