为啥这种语法专门用于初始化字符串文字而不能用于字符数组? [复制]

Posted

技术标签:

【中文标题】为啥这种语法专门用于初始化字符串文字而不能用于字符数组? [复制]【英文标题】:why is this syntax exclusively used to initialize string literals and can't be used for an array of characters? [duplicate]为什么这种语法专门用于初始化字符串文字而不能用于字符数组? [复制] 【发布时间】:2010-07-19 09:34:36 【问题描述】:

可能重复:initializing char arrays in a way similar to initializing string literals

下面是一个初始化字符串文字的示例,其中必须在字符串末尾添加终止空字符:

char reshte[]="sample string";

我想知道为什么我们不能在不终止空字符的情况下初始化一个字符数组,那样我们必须使用以下语法来代替,如果有大量字符,那会很累:

char reshte[]='s','a','m','p','l','e',' ','s','t','r','i','n','g';

【问题讨论】:

字符多的时候,最后多加一个空字符也无所谓吧? 我认为在我的情况下我根本不需要它真的很重要。 被同一个提问者所问的***.com/questions/3216462/… 欺骗了。另一个要求一个宏来解决它,并得到了答案。 【参考方案1】:

这是因为在 C 中,"" 中的字符被认为是一个字符串,并且字符串以零结尾。

char reshte[]= '1', '2', '3', '4' ;

也很高效,可以满足您的期望。

【讨论】:

【参考方案2】:

我不明白为什么您需要如此糟糕的没有终止字符的字符串。存储/性能方面,它不会成为问题。如果您想使用该实例化,您可以知道应用程序末尾不需要一个空字符。

或者你可以这样做:

char reshte[]="sample strin";
reshte[strlen(reshte)]='g';

【讨论】:

所以你的意思是,不使用终止空字符不是一个糟糕的软件设计? 这可能是一个糟糕的软件设计决策。但可以在特定场景下制作。需要考虑的事情:如果有人要维护您的代码,他们必须能够轻松地遵循它。 “始终编写代码,就好像最终维护您代码的人是一个知道您住在哪里的暴力精神病患者一样。” 是的,你是对的,我不想和那样的人争论!!! 暴力精神病患者...太好了,我必须记住那个。 +1。【参考方案3】:

我想知道为什么我们不能初始化一个字符数组不终止空字符

我们在谈论哪种语言?如果您手动提供长度,则可以在 C 中进行:

char reshte[13]="sample string";

这在 C++ 中是一个错误。

【讨论】:

以上是关于为啥这种语法专门用于初始化字符串文字而不能用于字符数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥带有两个元素的初始化器语法将一个元素放入字符串向量而不是两个?

为啥指针不继承字符串文字的固定大小

为啥这种“嵌套连接”适用于 PDO 而不适用于 MySql cli?

为啥要一个句号,“。”而不是加号“+”,用于 PHP 中的字符串连接?

为啥我不能从字符堆栈中弹出元素?

为啥文字不是 const (字符串除外)?