Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Использование неинициализированных переменных

18.08.2017, 12:52. Показов 4916. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть простой код
C++
1
2
3
4
5
6
7
8
9
//g++  5.4.0
 
#include <iostream>
 
int main()
{
    int n;
    std::cout << n;
}
В общем то он работает, http://rextester.com/YOGFL91563

Но на stackoverflow разные мнения по поводу корректности использования не инициализированных переменных.
Вот мне интересно следующее:
1. Какие могут быть проблемы? Ведь int по умолчанию имеет значение 0, и если не ошибаюсь это требование стандарта.
2. Почему компиляторы выдают warning при использовании неинициализированных переменных? Просто что бы напомнить об этом если вдруг мы случайно забудем инициализировать переменную перед тем как используем её?
3. 2017 студия вообще отказывается компилировать код в котором используются не инициализированные переменные. Это фича такая и как то отключается? Типа "не компилить если есть хотя бы 1 warning"?

Прошу разъяснить тех кто знает

Добавлено через 1 минуту
Особенно интересует ответ на вопрос #1
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.08.2017, 12:52
Ответы с готовыми решениями:

Предупреждения компилятора об использовании неинициализированных переменных
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;time.h&gt; #include &lt;stdlib.h&gt; #define n 5 #define m 5 #define p 5 #define q 5 ...

Хранение неинициализированных объектов шаблонного класса
Допустим, есть шаблонный класс template &lt;typename T&gt; class SomeValue; который хранит в себе какое-то значение. И есть нешаблонный...

использование переменных
Программа использует много включаемых файлов, в которых достаточное количество циклов.. Как лучше объявлять переменную i ?? Отдельно в...

41
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13241 / 6873 / 1827
Регистрация: 18.10.2014
Сообщений: 17,420
13.06.2018, 00:20
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Если ты питание включил, то какое-то значение в ячейке памяти в любом случае уже будет.

Поэтому такого, что

полностью пустая память
никогда не будет. На что тебе и намекали несколькими постами выше

Добавлено через 2 минуты

Мусор - это любое значение, которое программист не предусматривает логикой программы.
Мусор - это абстракция для неопределенного (в смысле непредусмотренного) программистом значения.
Ну тут не надо забывать, что переменные не обязательно хранятся буквально в памяти. Они могут жить исключительно в регистрах процессора, а тут даже в реально существующих архитектурах возможно состояние "полностью пустая память". Например: особое состояние NaT (Not-a-Thing) регистров в архитектуре Itanium. Теоретически, возможность создания такого состояния может распространяться и на обычную память.

В стандарте С С89/90 говорилось, что любое чтение неинициализированного значения является неопределенным поведением.

В стандарте С99 это правило сочли слишком жестким и ослабили - чтение неинициализированного значения дает либо неспецифицированное значение, либо trap representation (т.е. неопределенное поведение только в последнем случае).

Но этот вариант не очень хорошо согласуется с особенностями архитектуры Itanium. Поэтому в C11 тему развили дальше: в дополнение к сказанному в С99 добавили т.наз. "Itanium clause": чтение неинициализированой локальной переменной, которая теоретически может быть объявлена с классом памяти register - это всегда неопределенное поведение.

Это, кстати, привело к таким необычным последствиям, как

C
1
2
3
4
5
6
7
8
9
10
11
12
void foo() 
{
  unsigned char junk;
  unsigned char a = junk + 1; // неопределенное поведение
}
 
void bar() 
{
  unsigned char junk;
  &junk;
  unsigned char a = junk + 1; // просто неспецифицированное значение
}
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.08.2018, 05:43
Цитата Сообщение от Croessmah Посмотреть сообщение
Для фундаментальных типов значение неинициализированных переменных не определено.
"indeterminate value" нужно переводить аккуратно. Выражения "неопределённое значение" и "значение не определено" означают разное в C++, хотя с колхозной точки зрения могут быть неотличимыми.
Например для int, "indeterminate value" это не то же самое, что "какое-то значение из диапазона от INT_MIN до INT_MAX", как это часто понимают.
Кликните здесь для просмотра всего текста
И не то же самое, что "какое-то значение из диапазона от INT_MIN до INT_MAX, которое может меняться со временем", если кто-то это хотел написать.

Какое-то значение из диапазона — это какое-то значение из дапазона, а не "intederminate"-значение. Объект с неопределённым (indeterminate) значением может побитово совпадать с объектом с определённым значением, но при этом значения у этих объектов всё равно разные.

Так что, как бы это абсурдно ни звучало, но для фундаментальных типов значение неинициализированных переменных определено: indeterminate. А не "не определено" в смысле "unspecified" или "not defined" и т.п.

Так-то!
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.08.2018, 05:43

Использование файловых переменных
помогите пожалуста с задачей. Только пожалуйста с кодом С.:( Дан файл f, содержащий свединья о книгах. Свединье о каждой книге - это...

Использование динамических переменных
Необходимо используя динамические переменные и функции написать следующее: Дан массив размера N и целые числа K и L (0 ≤ K ≤...

Использование динамических переменных
Объясните смысл использования динамических переменных. Я практиковался их создавать, использовать. Конкретно в чём плюс динамических...

Использование переменных main из класса
Создал класс, подключил так: #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &quot;kartoteka.h&quot; #include...

Использование переменных из другой структуры
Добрый день, подскажите пожалуйста как реализовать такую вещь struct one{ void * a; int b; int c; }; struct two{ void *...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
42
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru