Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 02.09.2018
Сообщений: 3

Не могу разобраться в присвоении начального значения переменной по умолчанию.

02.09.2018, 03:12. Показов 1751. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Взял пример из книги:



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int main()
{
    double tmp[5] = {36.6, 36.9, 37.3, 38.3, 38.5};
    double sum;
 
    for(int i=0; i < 5; i++)
         sum+=tmp[i];
    
    cout << "среднее = " <<sum / 5<<endl;
    return 0;
}
Среда разработки - Code::Blocks



Почему программа работает правильно, если нет инициализации переменной sum (sum=0)??? По идее ведь в переменной sum без инициализации должна быть неопределённость и результат должен быть не верен???
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.09.2018, 03:12
Ответы с готовыми решениями:

Не могу разобраться с выводом значения переменной
Привет всем. Столкнулся в проблемой при доработке скрипта загрузки файлов на сервер. Задача: Загружать файл в определённую папку, давать...

Ошибка при присвоении значения Range к переменной
Пытаюсь создать массив в котором будут размещены все непустые строки из диапазона А2:102. Sub Price() Dim price_for_Bill As Double ...

Ошибка при присвоении значения переменной после блока WITH
Всем привет. Изучаю хранимые процедуры, подскажите плз: create procedure Proc1 @carType varchar(50), @maxPrice int OUTPUT AS ...

8
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
02.09.2018, 03:17
и что же тогда по-твоему неопределённость?
"Не могу разобраться Почему программа правильно работает" - вот это вот ею и называется
0
0 / 0 / 0
Регистрация: 02.09.2018
Сообщений: 3
02.09.2018, 03:53  [ТС]
Неопределённостью я назвал случайное содержимое неинициализированной переменной

Если просто вывести содержимое переменной sum, то там какое-то случайное значение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    double tmp[5] = {36.6, 36.9, 37.3, 38.3, 38.5};
    double sum;
 
    cout << sum;
 
   // for(int i=0; i < 5; i++)
   //      sum+=tmp[i];
 
   // cout << "среднее = " <<sum / 5<<endl;
    return 0;
}


Почему это число не участвует в подсчёте суммы?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
02.09.2018, 04:29
ну, во-первых это число 10 в -307й степени, что не так далеко от истины - ноль
во-вторых, ну чего теперь рассусоливать, ну не написали ноль, ну надо написать, напиши и проехали как говорится!
1
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
02.09.2018, 07:02
Цитата Сообщение от protosorg Посмотреть сообщение
double sum;
Означает только объявление переменной sum, начальное значение не присваивается.
Соответственно в sum может оказаться все, что угодно.
Надо
C++
1
double sum=0.0;
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
02.09.2018, 07:32
protosorg, такие книги вредно читать, особенно начинающим.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
02.09.2018, 08:53
Лучший ответ Сообщение было отмечено protosorg как решение

Решение

Цитата Сообщение от protosorg Посмотреть сообщение
Почему программа работает правильно, если нет инициализации переменной sum (sum=0)???
Поведение вашей программы не определено. Это, однако, не означает, что она обязана выдавать какие-то "случайные числа". Вам просто повезло, что начальное значение sum оказалось нулевым и программа "как будто" работала правильно. Никакого "почему" тут нет и быть не может. Сегодня ваша программа "работает", завтра - перестанет.
1
0 / 0 / 0
Регистрация: 02.09.2018
Сообщений: 3
02.09.2018, 16:45  [ТС]
Спасибо огромное всем ответившим! Разобрался. Значит в книге ошибка. Вопрос задал потому что везде пишут, что начальные значения надо ОБЯЗАТЕЛЬНО присваивать, а в этом примере не присвоено, а результат верен.

Просто мне повезло, что переменной sum присвоилось случайное значение очень близкое к 0. Попробовал изменить тип переменной sum на integer - и ошибка стала явной:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
int main()
{
   setlocale(LC_ALL, "Russian");
 
   int sum;
 
   double tmp[3] = {7, 12, 3};
 
   for (int i = 0; i < 3; i++)
    sum = sum + tmp[i];
 
    cout << sum << endl;
 
    return 0;
}
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
02.09.2018, 17:10
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вам просто повезло, что начальное значение sum оказалось нулевым
В стандарте написано, что оно должно было оказаться неопределённым (indeterminate):
Цитата Сообщение от http://eel.is/c++draft/dcl.init#12
If no initializer is specified for an object, the object is default-initialized.
When storage for an object with automatic or dynamic storage duration is obtained, the object has an indeterminate value, and if no initialization is performed for the object, that object retains an indeterminate value until that value is replaced ([expr.ass]).
Как оно могло оказаться нулевым, если сменить своё значение оно могло только в результате присваивания?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2018, 17:10
Помогаю со студенческими работами здесь

Ошибка при присвоении переменной значения ячейки массива
Ошибку error C2106: '=' : left operand must be l-value выдает на строчке: if (mas!=-1 &amp;&amp; mas!=-1 &amp;&amp; mas = mas) numprotclast = mas; ...

Синтаксис команды SET при присвоении переменной значения
Пишу вот так: set /p name = Project5.exe del name ren check.download name start nameТо есть в переменной naem имя файла, по этому...

Задание начального значения переменной
Как задать начальное значение переменной - случайный путь из коллекции путей Путиотпр ?

Изменение начального значения переменной в некотором файле
Помогите разобраться с одной проблемкой. У меня есть файл к примеру index.class.php. Там я создал класс и помещаю туда переменные с...

Не могу разобраться с выводом арифметической переменной
@echo off cd /d D: @for /f &quot;TOKENS=1 DELIMS=.&quot; %%i IN ('date /t') do (set Day=%%i) @for /f &quot;TOKENS=2 DELIMS=.&quot; %%j IN ('date /t')...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru