В каком случае значение переменной считается неопределенным кратко

Обновлено: 06.07.2024

В отличие от некоторых языков программирования, C/C++ не инициализирует большинство переменных автоматически заданным значением (например, нулем). Таким образом, когда компилятор выделяет переменной место в памяти, значением по умолчанию для этой переменной является любое (мусорное) значение, которое уже находится в этой области памяти! Переменная, которой не было присвоено известное значение (обычно посредством инициализации или присваивания), называется неинициализированной переменной.

Примечание автора

  • инициализация = объекту присваивается известное значение в точке определения;
  • присваивание = объекту присваивается известное значение в точке, выходящей за рамки определения;
  • неинициализированный = объекту еще не присвоено известное значение.

В качестве отступления.

Отсутствие инициализации является оптимизацией производительности, унаследованной от C, когда компьютеры были медленными. Представьте себе случай, когда вы собираетесь прочитать 100 000 значений из файла. В таком случае вы можете создать 100 000 переменных, а затем заполнить их данными из файла.

Если бы C++ инициализировал все эти переменные при создании значениями по умолчанию, это привело бы к 100 000 инициализаций (что было бы медленно) и к небольшой выгоде (поскольку вы всё равно перезапишете эти значения).

На данный момент вы всегда должны инициализировать свои переменные, потому что затраты на это ничтожны по сравнению с выгодой. Как только вы освоите язык, тогда могут быть определенные случаи, когда вы можете пропустить инициализацию в целях оптимизации. Но делать это всегда нужно выборочно и намеренно.

Использование значений неинициализированных переменных может привести к неожиданным результатам. Рассмотрим следующую короткую программу:

В качестве отступления.

Большинство современных компиляторов пытаются определить, используется ли переменная без присваивания значения. Если они смогут это обнаружить, они обычно выдадут ошибку времени компиляции. Например, компиляция приведенной выше программы в Visual Studio выдала следующее предупреждение:

Если ваш компилятор по этой причине не позволяет вам скомпилировать и запустить приведенную выше программу, вот возможное решение этой проблемы:

Использование неинициализированных переменных – одна из наиболее распространенных ошибок, которые совершают начинающие программисты, и, к сожалению, она также может быть одной из самых сложных для отладки (потому что программа всё равно может работать нормально, если неинициализированное значение было присвоено определенной области памяти, которая содержала приемлемое значение, например, 0).

Неопределенное поведение

Использование значения из неинициализированной переменной – наш первый пример неопределенного поведения. Неопределенное поведение – это результат выполнения кода, поведение которого не определено языком C++. В этом случае в языке C++ нет правил, определяющих, что произойдет, если вы используете значение переменной, которой не было присвоено известное значение. Следовательно, если вы действительно сделаете это, результатом будет неопределенное поведение.

Код, реализующий неопределенное поведение, может проявлять любые из следующих симптомов:

  • ваша программа при каждом запуске дает разные результаты;
  • ваша программа постоянно дает один и тот же неверный результат;
  • ваша программа ведет себя непоследовательно (иногда дает правильный результат, иногда нет);
  • кажется, что ваша программа работает, но позже выдает неверные результаты;
  • ваша программа вылетает сразу после запуска или позже;
  • ваша программа работает с одними компиляторами, но не работает с другими;
  • ваша программа работает до тех пор, пока вы не измените какой-нибудь другой, казалось бы, несвязанный код.

Или ваш код в любом случае может действительно вести себя правильно. Природа неопределенного поведения заключается в том, что вы никогда не знаете точно, что получите, будете ли вы получать это каждый раз, и изменится ли это поведение, когда вы внесете какие-либо изменения.

C++ содержит множество случаев, которые могут привести к неопределенному поведению, если вы не будете осторожны. Мы будем указывать на них в будущих уроках всякий раз, когда с ними столкнемся. Обратите внимание на эти случаи и убедитесь, что вы их избегаете.

Правило

Старайтесь избегать всех ситуаций, которые приводят к неопределенному поведению, например, использование неинициализированных переменных.

Примечание автора

Один из наиболее распространенных типов комментариев, которые мы получаем от читателей, гласит: «Вы сказали, что я не могу делать X, но я всё равно сделал это, и моя программа работает! Почему?".

Есть два общих ответа. Наиболее распространенный ответ заключается в том, что ваша программа на самом деле демонстрирует неопределенное поведение, но это неопределенное поведение в любом случае дает желаемый результат… пока. Завтра (или на другом компиляторе или машине) этого может и не быть.

Небольшой тест

Вопрос 1

Что такое неинициализированная переменная? Почему вам следует избегать их использования?

Неинициализированная переменная – это переменная, которой программа не присвоила значение (обычно посредством инициализации или присваивания). Использование значения, хранящегося в неинициализированной переменной, приведет к неопределенному поведению.

Вопрос 2

Что такое неопределенное поведение и что может произойти, если вы сделаете что-то, что демонстрирует неопределенное поведение?

Неопределенное поведение – это результат выполнения кода, поведение которого не определяется языком. Результатом может быть что угодно, в том числе и то, что ведет себя правильно.

Задание 1.
Из каких команд составляется линейный вычислительный алгоритм? Приведите пример.

Задание 2.
Что такое трассировка и как она производится?

Задание 3.
В каком случае значение переменной считается неопределенным?

Задание 4.
Напишите на АЯ алгоритм вычисления у по формуле у = (1 – х2 + 5х4)2, где х — заданное целое число. Учтите следующие ограничения: 1) в арифметических выражениях можно использовать только операции сложения, вычитания и умножения; 2) каждое выра­жение может содержать только одну арифметическую опера­цию. Выполните трассировку алгоритма при х = 2.

Задание 5.
Запишите алгоритм циклического обмена значениями трех пе­ременных А, В, С. Схема циклического обмена:

Например, если до обмена было: А = 1, В = 2, С = 3, то после об­мена должно стать: А = 3, B = 1, С = 2. Выполните трассиров­ку.

1. состоит из команд присваивания, например: a:=4

3. Если переменной не присвоено значение

Семён Герасимов Ученик (152) 5. var a, b, c, i, n, buf: integer; begin a:=1; b:=2; c:=3; Write('A=',a,' B=',b,' C=',c); while true do begin buf:=a; a:=b; b:=c; c:=buf; if a = 3 then break end; Writeln; Write('A=',a,' B=',b,' C=',c); end.

В каком случае значение переменной считается неопределенным.


Если ты ничего не присвоил переменной, то она не определена.


Даны три числа x, y, z?

Даны три числа x, y, z.

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

Помогите пожалуйста составить программу Paskal.


Какие команды присваивания составлены правильно?

Какие команды присваивания составлены правильно?

Сколько промежуточных переменных потребуется для того, чтобы переменной А было присвоено значение переменной В, переменной В - значение переменной С, а переменной С - значение переменной А?

Запишите соответствующий алгоритм на алгоритмической языке.


Как вы думаете, можно ли использовать в арифметическом выражении оператора присваивания неопределенную переменную?

Как вы думаете, можно ли использовать в арифметическом выражении оператора присваивания неопределенную переменную?

К каким последствиям это может привести?


В ЕГЭ по информатике есть задание с1 с параболой, объяснить пожалуйста в каком случае область считается больше параболы?

В ЕГЭ по информатике есть задание с1 с параболой, объяснить пожалуйста в каком случае область считается больше параболы?


3. В каком случае для числовой переменной следует указывать целый тип, в каком — вещественный?

3. В каком случае для числовой переменной следует указывать целый тип, в каком — вещественный?


Какие значения будут иметь переменные а и б после выполнения алгоритма?

Какие значения будут иметь переменные а и б после выполнения алгоритма.


В языке программирования Pascal переменная считается описанной, если указаны : А) Имя переменной Б) Имя и тип переменной В) Тип и значение переменной?

В языке программирования Pascal переменная считается описанной, если указаны : А) Имя переменной Б) Имя и тип переменной В) Тип и значение переменной.


1. какие команды присваивания составлены правильно?

1. какие команды присваивания составлены правильно?

A) A : = В б) А = В в) А = B + 1 г) А + 1 : = А 2.

Сколько промежуточных переменных потребуется для того, чтобы переменной А было присвоено значение переменной В, переменной В - значение переменной С, а переменной С - значение переменной А?

Запишите соответствующий алгоритм на алгоритмическом языке.


Как поменять местами значения этих переменных (т.


Запишите на языке Паскаль : переменной a будет присвоено значение квадрат числа 4, переменной b - значение модуль числа - 11, а переменной с - значение переменной а?

Запишите на языке Паскаль : переменной a будет присвоено значение квадрат числа 4, переменной b - значение модуль числа - 11, а переменной с - значение переменной а.


Информатизация – это производное от слова информация. Информатизация – это процесс получения, использования, хранения, передачи информации. На протяжении ХХ века сменялось множество способов обмена информацией. Если в XIX веке носителем информации..


Алгоритмы, результатами выполнения которых являются числовые величины, будем называть вычислительными алгоритмами. Рассмотрим пример решения следующей математической задачи: даны две простые дроби; получить дробь, являющуюся результатом деления одной на другую.

В школьном учебнике математики правила деления обыкновенных дробей описаны так:

1. Числитель первой дроби умножить на знаменатель второй.

2. Знаменатель первой дроби умножить на числитель второй.

3. Записать дробь, числителем которой является результат выполнения пункта 1, а знаменателем — результат выполнения пункта 2.

В алгебраической форме это выглядит следующим образом:

Теперь построим алгоритм деления дробей для компьютера. В этом алгоритме сохраним те же обозначения для переменных, которые использованы в записанной выше формуле. Исходными данными являются целочисленные переменные a, d, c, d. Результатом — также целые величины m и n.

Ниже алгоритм представлен в двух формах: в виде блок-схемы и на Алгоритмическом языке (АЯ).

Раньше прямоугольник в схемах алгоритмов управления мы называли блоком простой команды. Для вычислительных алгоритмов такой простой командой является команда присваивания. Прямоугольник будем называть блоком присваивания, или вычислительным блоком. В форме параллелограмма рисуется блок ввода/вывода. Полученный алгоритм имеет линейную структуру (рис. 2.1).


В алгоритме на АЯ строка, стоящая после заголовка алгоритма, называется описанием переменных. Служебное слово цел означает целый тип. Величины этого типа могут иметь только целочисленные значения.

Описание переменных имеет вид:

Список переменных включает все переменные величины данного типа, обрабатываемые в алгоритме.

В блок-схемах типы переменных не указываются, но подразумеваются. Запись алгоритма на АЯ ближе по форме к языкам программирования, чем блок-схемы.

Коротко о главном

Основные свойства присваивания:

• значение переменной не определено, если ей не присвоено никакого значения;

• новое значение, присваиваемое переменной, заменяет ее старое значение;

• присвоенное переменной значение сохраняется в ней вплоть до нового присваивания.

Обмен значениями двух переменных можно производить через третью дополнительную переменную.

В алгоритмах на АЯ указываются типы всех переменных. Такое указание называется описанием переменных.

Числовые величины, принимающие только целочисленные значения, описываются с помощью служебного слова цел (целый).


Вопросы и задания

1. Из каких команд составляется линейный вычислительный алгоритм?

2. Что такое трассировка? Как она производится?

3. В каком случае значение переменной считается неопределенным?

4. Что происходит с предыдущим значением переменной после присваивания ей нового значения?

5. Как вы думаете, можно ли использовать в выражении оператора присваивания неопределенную переменную? К каким последствиям это может привести?


6. Напишите на АЯ алгоритм сложения двух простых дробей (без сокращения дроби).


7. Напишите на АЯ алгоритм вычисления у по формуле

у = (1 - х 2 + 5x 4 ) 2 ,

где x — заданное целое число. Учтите следующие ограничения: 1) в арифметических выражениях можно использовать только операции сложения, вычитания и умножения; 2) каждое выражение может содержать только одну арифметическую операцию. Выполните трассировку алгоритма при x = 2.


8. Пользуясь ограничениями предыдущей задачи, напишите наиболее короткие алгоритмы вычисления выражений:

y = x 8 ; y = x 10 ; у = х 15 ; у = х 19 .

Постарайтесь использовать минимальное количество дополнительных переменных. Выполните трассировку алгоритмов.


9. Запишите алгоритм циклического обмена значениями трех переменных А, В, С. Схема циклического обмена:


Например, если до обмена было: А = 1, В = 2, С = 3, то после обмена должно стать: А = 3, В =1,С = 2. Выполните трассировку.


ЕК ЦОР: часть 2, глава 6, § 34. ЦОР № 9, 10.

§11

Знакомство с языком Паскаль

Основные темы параграфа:

возникновение и назначение Паскаля;

структура программы, на Паскале;

операторы ввода, вывода, присваивания;

правила записи арифметических выражений;

пунктуация Паскаля.

Алгоритмы, результатами выполнения которых являются числовые величины, будем называть вычислительными алгоритмами. Рассмотрим пример решения следующей математической задачи: даны две простые дроби; получить дробь, являющуюся результатом деления одной на другую.

В школьном учебнике математики правила деления обыкновенных дробей описаны так:

1. Числитель первой дроби умножить на знаменатель второй.

2. Знаменатель первой дроби умножить на числитель второй.

3. Записать дробь, числителем которой является результат выполнения пункта 1, а знаменателем — результат выполнения пункта 2.

В алгебраической форме это выглядит следующим образом:

Теперь построим алгоритм деления дробей для компьютера. В этом алгоритме сохраним те же обозначения для переменных, которые использованы в записанной выше формуле. Исходными данными являются целочисленные переменные a, d, c, d. Результатом — также целые величины m и n.

Ниже алгоритм представлен в двух формах: в виде блок-схемы и на Алгоритмическом языке (АЯ).

Раньше прямоугольник в схемах алгоритмов управления мы называли блоком простой команды. Для вычислительных алгоритмов такой простой командой является команда присваивания. Прямоугольник будем называть блоком присваивания, или вычислительным блоком. В форме параллелограмма рисуется блок ввода/вывода. Полученный алгоритм имеет линейную структуру (рис. 2.1).


В алгоритме на АЯ строка, стоящая после заголовка алгоритма, называется описанием переменных. Служебное слово цел означает целый тип. Величины этого типа могут иметь только целочисленные значения.

Описание переменных имеет вид:

Список переменных включает все переменные величины данного типа, обрабатываемые в алгоритме.

В блок-схемах типы переменных не указываются, но подразумеваются. Запись алгоритма на АЯ ближе по форме к языкам программирования, чем блок-схемы.

Коротко о главном

Основные свойства присваивания:

• значение переменной не определено, если ей не присвоено никакого значения;

• новое значение, присваиваемое переменной, заменяет ее старое значение;

• присвоенное переменной значение сохраняется в ней вплоть до нового присваивания.

Обмен значениями двух переменных можно производить через третью дополнительную переменную.

В алгоритмах на АЯ указываются типы всех переменных. Такое указание называется описанием переменных.

Числовые величины, принимающие только целочисленные значения, описываются с помощью служебного слова цел (целый).


Вопросы и задания

1. Из каких команд составляется линейный вычислительный алгоритм?

2. Что такое трассировка? Как она производится?

3. В каком случае значение переменной считается неопределенным?

4. Что происходит с предыдущим значением переменной после присваивания ей нового значения?

5. Как вы думаете, можно ли использовать в выражении оператора присваивания неопределенную переменную? К каким последствиям это может привести?


6. Напишите на АЯ алгоритм сложения двух простых дробей (без сокращения дроби).


7. Напишите на АЯ алгоритм вычисления у по формуле

у = (1 - х 2 + 5x 4 ) 2 ,

где x — заданное целое число. Учтите следующие ограничения: 1) в арифметических выражениях можно использовать только операции сложения, вычитания и умножения; 2) каждое выражение может содержать только одну арифметическую операцию. Выполните трассировку алгоритма при x = 2.


8. Пользуясь ограничениями предыдущей задачи, напишите наиболее короткие алгоритмы вычисления выражений:

y = x 8 ; y = x 10 ; у = х 15 ; у = х 19 .

Постарайтесь использовать минимальное количество дополнительных переменных. Выполните трассировку алгоритмов.


9. Запишите алгоритм циклического обмена значениями трех переменных А, В, С. Схема циклического обмена:


Например, если до обмена было: А = 1, В = 2, С = 3, то после обмена должно стать: А = 3, В =1,С = 2. Выполните трассировку.


ЕК ЦОР: часть 2, глава 6, § 34. ЦОР № 9, 10.

§11

Знакомство с языком Паскаль

Основные темы параграфа:

возникновение и назначение Паскаля;

структура программы, на Паскале;

операторы ввода, вывода, присваивания;

правила записи арифметических выражений;

пунктуация Паскаля.


Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого.


Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой.


Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰).


Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни.

Читайте также: