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

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

18.08.2017, 12:52. Показов 4711. Ответов 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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
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
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru