Это не относится к рекомендуемой практике (а не к undefined), но о том, что на самом деле гарантирует стандарт С++, в вопросе превращения всех байтов целочисленного типа в значение
(unsigned char)0
.суб >
Вопрос (ы)
В приведенном ниже фрагменте выражение, используемое оператором if, гарантируется, что оно будет оценено как true в С++ 11?
std::memset (
reinterpret_cast<char*> (&a), // int a;
(unsigned char)0,
sizeof (int)
);
if (a == 0) {
...
}
Прочитав цитаты из C99 и С++ 11 (далее в этом сообщении), мы обнаруживаем, что C99 явно гарантирует, что целочисленный тип со всеми битами, установленными в 0
, будет представлять значение 0
в этом типе.
Я не могу найти эту гарантию в стандарте С++ 11.
- Нет ли такой гарантии?
- Является ли результат предыдущего фрагмента действительно специфичным для реализации?
В C99 (ISO/IEC 9899: 1999)
5.2.1.2/1 Многобайтовые символы
Байт со всеми битами нуль должен интерпретироваться как нулевой символ независимо от состояния сдвига. Такой байт не должен быть частью какой-либо другой многобайтовый символ.
6.2.6.2/1 Целочисленные типы
Значения любых битов дополнений не определены. 45) Действительный (нелокальное) представление объекта со знаком целочисленного типа, где значный бит равен нулю - это действительное представление объекта соответствующего без знака, и будет представлять одно и то же значение.
Для любого целого тип, представление объекта, где все биты равны нулю, представление значения 0 в этом типе.
В С++ 11 (ISO/IEC 14882: 2011)
2.3/3 Наборы символов [lex.charset]
Основной набор символов выполнения и базовое выполнение широкоформатный набор должен содержать все элементы основного исходный набор символов, плюс управляющие символы, представляющие предупреждение, backspace и возврат каретки, плюс нулевой символ (соответственно, null широкий символ), представление которого имеет все нулевые биты.