“hello”和{"hello"}之间有什么区别?

7
在C/C++中,以下两行代码有什么区别:
char *str1="hello";  
char *str2={"hello"};  

1
它们都会导致编译失败。 - BЈовић
3
至少在 C++ 中是这样,但在 C 中不是(而谁知道“C/C++”是什么)。 - Christian Rau
1
@PeteBecker 一个问题“在C/C++中的X?”唯一可能意味着“在C中的X?在C++中的X?”这是不好的,因为在同一个问题中问几个问题是不好的。在发表此评论时,有一个仅适用于C ++的答案和另一个仅适用于C的答案。http://meta.stackexchange.com/questions/39223/one-post-with-multiple-questions-or-multiple-posts - Pascal Cuoq
1
@PeteBecker 当然我知道,讽刺是有意的。实际上,这个问题是*C/C++*完全不合适的情况之一(尽管我同意它有时可能是合适的,但通常不是,因为提问者通常不知道其含义),因为对于两种语言,答案是不同的。我知道对于C和C++来说,答案通常是相同的(至少对于纯语言和标准相关的问题),但在这里它们绝对不是相同的。 - Christian Rau
1
@BЈовић:实际上这并不会破坏编译。在C++中,它会发出一个警告(如果我没记错的话是“write-strings”),而在C中则可以正常编译。 - netcoder
显示剩余5条评论
4个回答

10
根据2011年C语言标准,第6.7.9条“初始化”第11段:“标量的初始化程序应为单个表达式,可用花括号括起来…”。这就是全部内容,没有语义差异;花括号可以存在或不存在,意义不会改变。

6

这种情况下仅使用样式。它们都会导致相同的结果,并且它们都是不良形式。您应该使用const char *str1 =“hello”;


{"hello"} 不是被认为是数组吗?我们知道要定义数组时,我们会写在 {} 中,我只是对此感到困惑,如果 char *str2={"hello","hi"}; 的情况下会怎样? - Pratik
@JensGustedt,请问标量类型的定义是什么? - yejinxin
@yejinxin,这是C语言中的基本概念,包括整型、浮点型和指针类型。 - Jens Gustedt
@JensGustedt,嗯,我想我的英语太差了...我现在知道了。 - yejinxin

2

请查看https://dev59.com/LnA75IYBdhLWcg3wH1RB#3462768

这些大括号是多余的。

使用“gcc -S”生成以下代码的汇编形式可以确认它们生成完全相同的内容(每种情况下常量略有不同):

#include <iostream>
using namespace std;

void test1() {
    const char *str1="hello1";
    cout << str1 << endl;
}

void test2() {
    const char *str2={"hello2"};
    cout << str2 << endl;
}

int main() {
    test1();
    test2();
}

-1

数组和“字符串”之间没有区别,因为字符串是字符数组。


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