Это дело не в рекомендуемой практике(ни неопределенном поведении), а в том, что на самом деле гарантирует c++-стандарт в отношении обращения всех байтов целочисленного типа к значению
(unsigned char)0
.Вопрос(ы)
В приведенном ниже фрагменте выражение, используемое оператором if-statement, гарантированно оценивается как trueв c++ 11?
std::memset ( reinterpret_cast
(&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]
Основной набор символов выполнения и базовый набор символов выполнения набор широких символов должен содержать все элементы основного исходный набор символов, а также управляющие символы, представляющие предупреждение, backspace и возврат каретки плюс нулевой символ(соответственно, нулевой широкий символ), представление которого имеет все нулевые биты.