这不是推荐做法的问题(也不是未定义的行为),而是关于c++标准在将整数类型的所有字节转换为
(unsigned char)0
.
问题
在下面的片段中,if 语句使用的表达式是否保证在c++11中被评估为true?
std::memset (
reinterpret_cast<char*> (&a), // int a;
(unsigned char)0,
sizeof (int)
);
if (a == 0) {
...
}
通过阅读 C99 和 C++11 标准的引用(在这篇文章的后面),我们发现 C99 明确保证所有位都设置为的整数类型0
将表示该0
类型中的值。
我在 C++11 标准中找不到这个保证。
- 没有这样的保证吗?
- 上一个片段的结果真的是特定于实现的吗?
在 C99 中 (ISO/IEC 9899:1999)
5.2.1.2/1 多字节字符
所有位为零的字节应解释为与移位状态无关的空字符。这样的字节不应作为任何其他多字节字符的一部分出现。
6.2.6.2/1 整数类型
任何填充位的值都是未指定的。45)符号位为零的有符号整数类型的有效(非陷阱)对象表示是相应无符号类型的有效对象表示,并且应表示相同的值。
对于任何整数类型,所有位都为零的对象表示应是该类型中值零的表示。
在 C++11 中 (ISO/IEC 14882:2011)
2.3/3 字符集 [lex.charset]
基本执行字符集和基本执行宽字符集应分别包含基本源字符集的所有成员,加上表示警报、退格和回车的控制字符,加上一个空字符(分别为空宽字符),其表示全为零位。