Использование возврата;Для начинающего, с другой точки зрения C ++ - PullRequest
0 голосов
/ 27 мая 2018

Я только начал программировать и много слышал определение стандартного новичка «использование возвращаемого значения в основном», но оно не дошло до того, что я пытаюсь понять.Итак, да, возвращаемое значение 0 для 'int main', например, означает, что выполнение программы было успешным, и, поскольку main имеет тип данных int, 0 отражает это.

НО в чем смысл этого?Разве компьютер уже не знает, что код был успешным или нет?Конечно, мы могли бы написать некорректный код и затем вернуть 0, и по этой логике мы (программисты) говорим, что этот код корректен, но компилятор фактически выполняет программу и, если он ошибочен / некорректен, он просто не может с ней работать.

Пожалуйста, используйте объяснения, которые может понять новичок.

Ответы [ 5 ]

0 голосов
/ 27 мая 2018

Возвращаемое значение - это сообщение, которое программист хочет передать исполнителю программы при выходе.Это простая коммуникация низкого уровня.Могут быть и различные успехи.

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

0 голосов
/ 27 мая 2018

Код возврата вашей программы не о сбое, а о функциональном сбое.

Например, программа grep определяет код выхода / сбоя 0 как успешно найденныйи 1 как не найдено.В то время как значение 2 используется для неверного ввода.

В сценариях это может использоваться для некоторой автоматизированной логики без необходимости интерпретации результатов пользователем.

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

0 голосов
/ 27 мая 2018

Возвращаемое значение из main указывает, работает ли что-то в «деловом» смысле, а не в «техническом» смысле.Если в программе есть технический недостаток, main, вероятно, вообще не вернется, так как программа, вероятно, потерпела крах, или возвращаемое значение будет бессмысленным из-за неопределенного поведения.

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

0 голосов
/ 27 мая 2018

Возвращаемое значение main, которое становится кодом завершения процесса после его выполнения, связано не с тем, является ли код правильным C ++, а с тем, выполнялся ли он правильно с точки зрения его семантики (скажем, его бизнес-логика).

Хотя программа существует в виде исходного кода на C ++, возврат из main является инструкцией, как и любая другая.Наличие return 0; в main не повлияет на то, является ли ваша программа допустимой программой на C ++, и не исправит, например, синтаксические ошибки.Во время компиляции это совершенно не имеет значения для правильности.

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

То есть, когда вы выполняете, например, gcc ... -o myapp, возвращаемое значение main не вступает в игру (на самом деле, оно даже не существует).Но когда вы затем выполняете ./myapp, его код завершения процесса (который используется, например, shell) - это то, что устанавливается возвращаемым значением main.

Например,команда unix if проверяет, возвращен ли ее аргумент 0 или не 0:

if ./myapp; then
  echo "Success"
fi

Отражает ли приведенный выше сценарий оболочки Success или нет, зависит от того, будет ли код завершения процессаmyapp было 0 или нет, другими словами, возвращала ли его функция main 0 или нет.

Эквивалент такой проверки в Windows-мире будет:

myapp.exe
if errorlevel 1 goto bad
echo "Success"
bad:

Одно общее соглашение - иметь код завершения процесса равным 0 при успешном завершении, 1, когда программе не удалось выполнить свою задачу (например, ее попросили удалить несуществующий файл), и 2, когда она былавызван неправильно (например, ему была задана опция командной строки, которую он не понимает). Эти являются значениями main возвратов.

0 голосов
/ 27 мая 2018

Программа может потерпеть неудачу, потому что некоторые ожидания не оправдываются.

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

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

Возвращение от main на практике не является некоторым произвольным целым числом.В Linux и многих системах POSIX это должно быть некоторое целое число от 0 до 255 (где 0 означает «успешное выполнение», а другие значения выхода - для сбоев).Подробнее см. exit (3) & waitpid (2) .

По некоторым соглашениям (которые необходимо документировать) коды ошибок(на практике их немного, обычно менее дюжины, и довольно часто 0-названный EXIT_SUCCESS - в случае успеха и 1-именный EXIT_FAILURE - в случае отказа) может рассказать о причине сбоя.В качестве примеров см. Документацию tar (1) , coreutils программ, grep (1) и т. Д.

BSD-юниксы определяют некоторые соглашенияв sysexits (но программы Linux обычно не используют это).

Сценарии оболочки могут легко тестировать и обрабатывать код выхода.

Читатьтакже о философии Unix .Успешные программы командной строки (например, cp (1) ) часто могут молчать.Сообщения об ошибках (по соглашению) будут отправляться на stderr .

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

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

...