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

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

18.08.2017, 12:52. Показов 4911. Ответов 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
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
18.08.2017, 16:18
Студворк — интернет-сервис помощи студентам
Undisputed,
Потому что в этом случае:
C++
1
if (x == false) {
Компилятор на самом деле делает
C++
1
if (x ^ 0x1) {
В итоге, когда у тебя в x на самом деле 10, т.е. 1010(2), то после операции 10 ^ 0x1 у тебя получится 1011(2), что явно не равно нулю. В то время, когда при x = 1 (true) мы получили бы 0 и не попали бы во второе условие,

Это не предположение. Я точно знаю, потому что посмотрел ассемблерный листинг именно этой версии компилятора, именно на этой платформе и именно с такими ключами компиляции
Другая версия компилятора может делать иначе и это поведение не воспроизведется. На то оно и UB.
2
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
18.08.2017, 16:42
Цитата Сообщение от DrOffset Посмотреть сообщение
Другая версия компилятора может делать иначе и это поведение не воспроизведется
Например http://rextester.com/FZW81132

Добавлено через 6 минут
А ещё будут отличия с
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    bool x;
    memset(&x, 10, sizeof(bool));
    if (x == true) {
        std::cout << "is true" << std::endl;
    }
    if (x == false) {
        std::cout << "is false" << std::endl;
    }
}
и с включенной оптимизацией в твоей версии кода - http://rextester.com/WXJITR26023

Добавлено через 6 минут
А вместо того, чтоб мучаться с неопределённым поведением, просто пользуйся неявным или (для понимания) явным преобразованием типов. Неявное - это как в посте от hoggy, а явное это
C++
1
bool b = static_cast<bool>(10);
http://rextester.com/QNKD56538

Добавлено через 2 минуты
И да, в стандарте С++ оператор if() принимает в качестве входного значения именно bool, поэтому "получать из bool bool сравнением с константным bool" нерационально.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
18.08.2017, 16:44
Цитата Сообщение от TRam_ Посмотреть сообщение
C++
1
bool b = static_cast<bool>(10);
Здесь не нужен static_cast.
При неявном касте int к bool, получим false,
если значение равно нулю и true, если не равно нулю.
1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
18.08.2017, 16:47
Это все потому, что Х описано, как bool.
Тем самым обозначив, что имеет смысл только 0 бит.
А что вы еще хотели, собственно?
Хотите, чтобы Х было bool, так и работайте с ней, как с bool
Опишите Х, как int, и получите нормальную реакцию

Добавлено через 3 минуты
Можно и так преобразовать:
C
1
bool b = (10 != 0);
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
18.08.2017, 16:54  [ТС]
TRam_,
hoggy,
Ок, если сравнение идет единички и нолика с десяткой, тогда почему на том же компиляторе и с теми же ключиками ничего не выводится, в отличии от оригинала где срабатывают оба условия?
C++
1
2
3
4
5
6
7
8
9
int main()
{
    if (10 == true) {
        std::cout << "is true" << std::endl;
    }
    if (10 == false) {
        std::cout << "is false" << std::endl;
    }
}
DrOffset,
Как я понял компилятор просто берет адрес + sizeof(type) обоих операндов и делает xor, и если в результате не все нули - значит тру...
Да уж...

А под мусором что может подразумеваться? Либо полностью пустая память, либо всякие данные которые например остались от предыдущей программы которая вернула память ОС, и когда мы просим у ОС память для нашей программы она вполне может выделить тот кусок памяти которая вернула предыдущая программа и там будут именно те байтики которые остались от прежней программы которая владела этим участком памяти?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
18.08.2017, 17:04
Цитата Сообщение от Undisputed Посмотреть сообщение
в отличии от оригинала где срабатывают оба условия?
Потому что true и false будут преобразованы в int и дадут 1 и 0 соответственно.
Далее, сравнение двух int'ов, 10 == 1 и 10 == 1. С чего бы они дали true?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
18.08.2017, 17:05
Цитата Сообщение от Undisputed Посмотреть сообщение
и там будут именно те байтики которые остались от прежней программы которая владела этим участком памяти?
Естественно. Кроме, как сказано выше со ссылкой на стандарт, глобальных и статических переменных.
1
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
18.08.2017, 17:05
Цитата Сообщение от Undisputed Посмотреть сообщение
Либо полностью пустая память
Это как? Выжженные выжигателем чипы памяти?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
18.08.2017, 17:05  [ТС]
Croessmah,
Так и я о том же))

Не по теме:

Ох уж этот с++

0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
18.08.2017, 17:06
Цитата Сообщение от Undisputed Посмотреть сообщение
Ох уж этот с++
C++ здесь ни при чем.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
18.08.2017, 17:09  [ТС]
Croessmah,
Ну память же энергозависимая, после отключения питания все данные очищаются же... Я об этом.

Добавлено через 18 секунд
TRam_,
Понятно, спасибо!

Добавлено через 1 минуту
Croessmah,
Я к тому, что вроде бы пытался разобраться с значением по умолчанию типа int, а дошло аж до ассемблерных листингов))

Добавлено через 19 секунд
Croessmah,
Я к тому, что вроде бы пытался разобраться с значением по умолчанию типа int, а дошло аж до ассемблерных листингов))
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
18.08.2017, 17:12
Цитата Сообщение от Undisputed Посмотреть сообщение
после отключения питания все данные очищаются же
Их кто-то очищает? Наверное, сборщик мусора.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
18.08.2017, 17:20  [ТС]
Croessmah,
В пройцессор встроен умный указатель )
Все что я знаю по этому поводу эти данные которые были в памяти пропадают если отключить питание...
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
18.08.2017, 17:30
Цитата Сообщение от Undisputed Посмотреть сообщение
Я к тому, что вроде бы пытался разобраться с значением по умолчанию типа int
И для проверки выбрали впихивание типа int вовнутрь типа bool с использованием преобразования в (void *) и побитовым копированием. Как-то проверка не оттуда началась. Лучше бы начали с разбора, что используется в операторе if в качестве условия.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
18.08.2017, 17:47
Цитата Сообщение от Undisputed Посмотреть сообщение
Все что я знаю по этому поводу эти данные которые были в памяти пропадают если отключить питание...
Только причем тут C++? )
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
18.08.2017, 18:01  [ТС]
TRam_,
Ну пример такой привели, что я мог поделать?) Но думаю было круто, узнал что-то новое...)

DrOffset,
Ну данные программы написанные на с++ используют эту память
А вообще все началось с того что я захотел уточнить что попадает под понятие "мусор" в памяти...
Но т.к я наверное уже всех задолбал в этой теме то не буду идти дальше... во всяком случае сейчас))
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
18.08.2017, 18:08
Цитата Сообщение от Undisputed Посмотреть сообщение
Ну данные программы написанные на с++ используют эту память
Если ты питание выключил, то программу ты запустить не сможешь. Или это как в той байке, про энергонезависимую систему?

Если ты питание включил, то какое-то значение в ячейке памяти в любом случае уже будет.

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

Добавлено через 2 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
А вообще все началось с того что я захотел уточнить что попадает под понятие "мусор" в памяти...
Мусор - это любое значение, которое программист не предусматривает логикой программы.
Мусор - это абстракция для неопределенного (в смысле непредусмотренного) программистом значения.
2
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
18.08.2017, 18:17  [ТС]
DrOffset,
Аа теперь понял, спасибо)

Просто я не знаю как оно хранится там в железке.
Думал на плате есть зона данных, а наличие данных зависит от распределения электричества в этой зоне.
А после перезагрузки питания предыдущее состояние исчезает, и данные бывают только в той части платы которая была выбрана для хранения данных которые нужны для начального запуска системы... Ну и соответственно прежнего состояния уже нет..., электричество то выключали... тогда вопрос - откуда там взяться данным?) вот так думаю...

Если я продолжу изучение плюсов и железа, походу позориться на форуме мне ещё долго))

Добавлено через 1 минуту
Про мусор круто сказано! Просто и понятно.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
18.08.2017, 18:19
А это определенное поведение или нет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cstdint>
#include <iomanip>
 
int main() {
 
    uint8_t a = 2; // 0b00000010
    uint8_t b = 3; // 0b00000011
 
    std::cout.setf(std::ios::boolalpha);
 
    std::cout << *reinterpret_cast<bool*>(&a) << std::endl;
    std::cout << *reinterpret_cast<bool*>(&b) << std::endl;
 
    return 0;
}

Не по теме:

К разговору о bool

1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
18.08.2017, 18:53
pav1uxa, неопределённое.

Добавлено через 4 минуты
Определённым будет
C++
1
std::cout << (a != 0) << std::endl;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.08.2017, 18:53

Использование файловых переменных
помогите пожалуста с задачей. Только пожалуйста с кодом С.:( Дан файл 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 *...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
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, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru