Лучший способ объяснить декларативную ошибку в C++?

Новый ответ для Сборки iTerm2 3.3.4 пользователя:

Шаг 1: (macOS X) вкладка System Preferences> Keyboard> Shortcuts> Избранное Управление полетом (оставленный панель)> ярлыки Снятия флажка, которые маркировали как "Перемещение, оставили пространство", и "Перемещение исправляет пространство"

Шаг 2: (iTerm2 Сборка 3.3.4), Предпочтения> Профили> Выбор * Значение по умолчанию (оставленный панель)> вкладка Keys> Удаляют обоих "вЊҐ->" и "вЊҐ< -" записи> Набор обе "Левых Опции (вЊҐ) Ключ": и "Правильная Опция (вЊҐ) Ключ": к Esc +

No бездельничающий с профилями оболочки, нет бездельничающими с нижним masOS Терминал (по умолчанию), никакой awkwards Esc+F/B, & промывки; повторите ерунду.

Заключенная сделка!!!

Обладают этой подсказкой, моими коллегами - ПРОГРАММИСТАМИ!

6
задан ybakos 1 April 2012 в 22:36
поделиться

9 ответов

Сообщите автору, что

pounds = newtons/NEWTONS_PER_POUND;

приказывает процессору

  • принять значение по адресу, называемому «ньютонами».
  • принять значение по адресу, указанному как «NEWTONS_PER_POUND» "
  • разделить их
  • сохранить результат по адресу, указанному как" фунты "

то, что он ищет, скорее всего, является функцией в императивных терминах:

double newtons_to_pounds(double newtons) {
  return newtons/NEWTONS_PER_POUND;
}

...

newtons = 10.0;
cout << newtons_to_pounds(newtons) << endl;    /* a big number, not 10.0/4.448 */
return 0;
21
ответ дан 8 December 2019 в 02:03
поделиться

C ++ - это императивный язык программирования, а не средство решения уравнений.

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

Вот подробное объяснение:

double pounds, newtons;
pounds = newtons/NEWTONS_PER_POUND;
newtons = 10.0;

Первый оператор объявляет две переменные без их инициализации. На данный момент их значения не указаны.

Второй оператор считывает значение ньютонов (которое может быть любым) и делит его на NEWTONS_PER_POUND . Результат (который может быть любым) присваивается фунтов .

18
ответ дан 8 December 2019 в 02:03
поделиться

Что ж, это не должно быть слишком сложно объяснить, независимо от уровня подготовки студентов: просто все те, что C ++ оценивает программы шаг за шагом, оператор за оператором (несмотря на артефакты компилятора, такие как переупорядочивание…).

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

8
ответ дан 8 December 2019 в 02:03
поделиться

Ньютоны не ленивые

Таким образом расчет выполняется во время декларирования, а не во время запроса. Ему нужен функциональный код, а не то, что будет делать C ++.

4
ответ дан 8 December 2019 в 02:03
поделиться

Если человек не слишком техничен, вы можете попробовать:

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

4
ответ дан 8 December 2019 в 02:03
поделиться

Объясните, что фунтам присваивается значение в строке с оператором присваивания:

pounds = newtons/NEWTONS_PER_POUND;

Если это не так, но эти фунты были вычислены при их использовании (как в случае с оператором cout ), то, если изменится значение ньютонов, то изменится и значение фунтов. Поскольку фунты не являются указателями любого типа, а представляют собой простое целое число, это невозможно.

1
ответ дан 8 December 2019 в 02:03
поделиться

А как насчет пошагового выполнения кода в отладчике?

IME нет ничего подобного, чтобы понять выполнение программы, написанной на процедурном языке (т. Е. Смоделированной на основе того, как ЦП фактически выполняет код).

1
ответ дан 8 December 2019 в 02:03
поделиться

Вы пытаетесь заставить слушателя претерпеть сдвиг парадигмы - изменить весь его / ее подход к пониманию этого кода.

«фунты» - это просто число. Нет понятие о том, как это создано. Ты говоришь "фунтов", как это создано, не будет помнить. Он просто запомнит, что это так, а не то, как он создан.

Может показаться немного странным антропоморфизовать блок памяти. : -)

0
ответ дан 8 December 2019 в 02:03
поделиться

Возьмем немного более сложный пример, где переменная вроде newtons повторно используется и ей присваиваются значения более одного раза. Например:

double pounds, newtons;

newtons = 10.0;
pounds = newtons/NEWTONS_PER_POUND;
cout << pounds << endl;

newtons = 15.0;
pounds = newtons/NEWTONS_PER_POUND;
cout << pounds << endl;

return 0;

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

0
ответ дан 8 December 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: