«Утро» - правильный вывод для этой программы.
Во-первых, нет никаких оснований ожидать сообщения об ошибке, поскольку программа нигде не печатает его. В частности, функции стандартной библиотеки C, такие как scanf()
, не передают сообщения об ошибках в стандартные потоки. Вместо этого они возвращают информацию о состоянии через свои возвращаемые значения , а в некоторых случаях путем установки локальной переменной потока errno
. Эта программа даже не проверяет возвращаемое значение scanf
, поэтому нет оснований полагать, что она выдаст сообщение об ошибке из-за возникшей там проблемы.
Во-вторых, хотя строка формата, переданная в scanf
, по-видимому, содержит опечатку, это все еще совершенно правильный формат. Он говорит scanf
попытаться прочитать (но больше ничего не делать с) двухсимвольную последовательность «& d». Если это не следующие два символа, которые он видит, то произойдет сбой с ошибкой сопоставления, которую он укажет, вернув 0. Фактически, он также вернет 0, если это следующие два символа, потому что возвращаемое значение сообщает количество полей ввода успешно отсканированных, преобразованных и сохраненных, а формат не описывает никаких полей ввода.
Второй аргумент scanf
игнорируется во всех случаях, но некоторые компиляторы выдают предупреждение (не ошибку) об этом.
Поскольку scanf
не присваивает значение переменной n
, оно сохраняет любое значение, которое имело до вызова. Поскольку он был объявлен в области видимости файла, он автоматически инициализируется равным нулю перед запуском программы, и он все еще имеет это значение, когда исполняемый файл достигает оператора switch
. Это приводит к выполнению дела по умолчанию.