为什么C++不为字符数组接受有符号或无符号字符

Sci*_*eur 21 c++ arrays char

我在Visual Studio 2017中以纯模式使用C++.该编译器编译下面的语句而没有抱怨:

const char * AnArrayOfStrings[]  = {"z1y2x3w4", "Aname"};
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改上述语句以指定char是有符号或无符号的,则编译器会发出C2440错误.例如,下面的语句编译:

const signed   char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};

const unsigned char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};
Run Code Online (Sandbox Code Playgroud)

我没有看到编译器在明确表示char的符号时拒绝编译语句的原因.

我的问题是:有没有一个很好的理由我没有看到编译器拒绝编译这些语句?

感谢您的帮助(我在StackOverflow中进行了研究,C++文档,我使用了Google,并且为了自己找到答案而咨询了大量的C/C++书籍,但仍有一个原因让我望而却步.)

Gau*_*gal 15

"z1y2x3w4"const char[9]并没有隐式转换从const char*const signed char*.

你可以用 reinterpret_cast

const signed char * AnArrayOfStrings[]  = {reinterpret_cast<const signed char *>("z1y2x3w4"),
                                           reinterpret_cast<const signed char *>("Aname")};
Run Code Online (Sandbox Code Playgroud)

  • "`"z1y2x3w4"`实际上是`const char*`",它是一个`const char [9]`. (13认同)
  • @ScienceAmateur在你写的"在所有情况下他们都是char".那不对.它们是不同的类型,代表不同的东西.阅读/sf/answers/30559301/虽然C可能会默默地允许您执行此类转换,但C++更严格并且需要显式转换 (4认同)
  • @ScienceAmateur Weel,一个"签名的字符"可能不会使用所有位.这是历史性的事情(查找有符号数和陷阱表示的表示).无论如何,我认为这开始是一个动人的问题.原始问题的答案是"因为类型不同".上面评论中的问题更像是"为什么标准定义了三种不同的字符类型".对我来说,这将是另一个不同的答案. (3认同)