C++;将int赋值给char-为什么这项工作至少没有警告? 为什么C++(可能还有C)允许我分配和int到char而不给我一个警告?< /p>

C++;将int赋值给char-为什么这项工作至少没有警告? 为什么C++(可能还有C)允许我分配和int到char而不给我一个警告?< /p>,c++,C++,直接赋值可以吗,比如 int i = 12; char c = i; i、 e.进行隐式转换,还是使用静态转换 编辑 顺便说一句,我使用的是gcc在显式cast语法发明之前,它在C中是允许的。 然后,它仍然是一种常见的实践,所以C++继承它,以便不破坏大量代码。 实际上,大多数编译器都会发出警告。如果没有,请尝试更改其设置。char与short相同。因此,应该有一个关于可能丢失信息的警告。可能您关闭了警告,请尝试以某种方式配置编译器/ide 最初设计的C并不是一个真正的。一般的理念是,程序员必

直接赋值可以吗,比如

int i = 12;
char c = i;
i、 e.进行隐式转换,还是使用
静态转换

编辑


顺便说一句,我使用的是
gcc

在显式cast语法发明之前,它在C中是允许的。 然后,它仍然是一种常见的实践,所以C++继承它,以便不破坏大量代码。
实际上,大多数编译器都会发出警告。如果没有,请尝试更改其设置。

char与short相同。因此,应该有一个关于可能丢失信息的警告。可能您关闭了警告,请尝试以某种方式配置编译器/ide

最初设计的C并不是一个真正的。一般的理念是,程序员必须知道自己在做什么,而编译器就在那里帮助您完成这项工作。如果在一个表达式中要求在float、int和unsigned char之间转换六到七次,那么这一定是您想要的

C++选择了这一点,这样所有现有的C代码就不会太难移植了。不过,他们正慢慢地试图通过每次修订使其更加强大。今天,任何C++编译器都会警告你,如果你把警告级别提高(我强>高度/强)建议你做。 否则,也许您应该研究真正的强类型语言,如Java和Ada。等效的艾达代码在没有显式转换的情况下不会编译。

简短的回答:在你的例子中,(C++的标准)是可以的。


稍长一点的回答:如果char是有符号的,并且您试图给它分配一个超出其范围的值,这是不好的。如果它是无符号的(char是否有符号取决于您的环境),那么就可以得到模算术。由于第一种情况,编译器通常会有一个开关来警告您,但只要您保持在边界内,这是非常好的(但是,明确的强制转换以明确您的意图并不有害)。

如果您提高警告级别,您可能会收到警告。我也同意提高警告级别是一个好主意。在任何情况下,如果需要分配,请使用static_cast以便在GCC上清除,在使用
-Wconversion
标志之前,不会收到关于潜在类型转换问题的警告(
-Wall
不会对此发出警告)。在VC++上,
/W4
将警告此转换可能导致的数据丢失。这不一定是真的,因为
sizeof(char)==sizeof(short)
,在通用平台(x86)上,它们的大小肯定不一样。您唯一能保证的是
sizeof(short)>=sizeof(char)
。char与short不同。