У C11:
- Це явно не визначено відповідно до 6.3.2.1/2, якщо
a
ніколи не береться його адреса (цитується нижче)
- Це може бути уявлення про пастку (що викликає UB при доступі). 6.2.6.1/5:
Певні представлення об'єктів не обов'язково представляють значення типу об'єкта.
Непідписані ints можуть мати уявлення про пастки (наприклад, якщо він має 15 бітів точності та 1 біт парності, доступ a
може спричинити помилку парності).
6.2.4 / 6 говорить, що початкове значення є невизначеним, а визначення під п. 3.19.2 є або невизначеним значенням, або поданням пастки .
Далі: у C11 6.3.2.1/2, як зазначив Паскаль Куок:
Якщо lvalue позначає об'єкт автоматичної тривалості зберігання, який міг бути оголошений за допомогою класу сховища реєстру (ніколи не була взята його адреса), і цей об'єкт неініціалізований (не оголошений за допомогою ініціалізатора і жодне присвоєння йому не було виконано до використання ), поведінка невизначена.
Це не має винятку для типів символів, тому цей пункт, здається, замінює попереднє обговорення; доступ x
негайно не визначений, навіть якщо представлення пастки не існує. Цей пункт було додано до C11 для підтримки процесорів Itanium, які насправді мають стан захоплення для реєстрів.
Системи без уявлення про пастки: Але що, якщо ми кинемо &x;
так, що заперечення 6.3.2.1/2 більше не застосовуватиметься, і ми знаходимося в системі, яка, як відомо, не має уявлень про пастки? Тоді значення є невизначеним значенням . Визначення невизначеного значення в 3.19.3 є дещо розмитим, проте воно пояснюється в DR 451 , який робить висновок:
- Неініціалізоване значення за описаних умов може змінити його значення.
- Будь-яка операція, виконана з невизначеними значеннями, матиме в результаті невизначене значення.
- Функції бібліотеки виявлятимуть невизначену поведінку при використанні з невизначеними значеннями.
- Ці відповіді підходять для всіх типів, які не мають уявлень про пастки.
Згідно з цією резолюцією, int a; &a; int b = a - a;
результат b
залишається невизначеним.
Зверніть увагу, що якщо невизначене значення не передається функції бібліотеки, ми все ще знаходимося у сфері невизначеної поведінки (не невизначеної поведінки). Результати можуть бути дивними, наприклад, if ( j != j ) foo();
можна подзвонити Фу, але демони повинні залишатися закріпленими в носовій порожнині.
a
подальшого читання із сміття, що там сидить. Якщо ні, то поведінка невизначена.