Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Вопросы по книге Кернигана (2-е изд.)


Автор: Compositum 26.11.2010, 11:19
Добрый день. Читаю Брайна Кернигана "Язык программирования C" 2-е издание. По ходу чтения возникают некоторые вопросы.

1. Код копирования файлов:
Код

#include <stdio.h>

main ()
{
    c = getchar();

    while (c != EOF) {
        putchar(c);
        c = getchar();
    }
}

Непонятные моменты:
1.1. Я не понял, откуда именно  getchar считывает символы? Ведь источник (файл) не указан....
1.2. Куда именно putchar записывает символ? Ведь целевой файл/массив не указан...

Если символы считываются из консоли и записываются в консоль, то EOF однозначно не будет найден (насколько я понимаю).

2. Ещё один фрагмент кода:
Код

#include <stdio.h>

main ()
{
    ...
    return 0;    
}

Но ведь метод main определён не как int main(). Т.е. если перед функцией не указано, какой тип значения она должна возвращать, то по умолчанию подразумевается int?
Если "да", то почему нет ошибки, когда в методе main() отсутствует оператор return число?

Автор: bsa 26.11.2010, 11:35
1.1 и 1.2. когда запускается консольное приложение открыто 3 файла: stdin, stdout и stderr. Все функции ввода/вывода, у которых не указан файл явно работают с первыми двумя, но perror - с третьим. Первый - стандартный ввод (клавиатура), второе - стандартный вывод (экран), третье - стандартный вывод ошибок (тоже экран, но не буферизированный). Их можно изменять при запуске: program.exe <input.txt >output.txt 2> error.txt. Можно и так: program.exe < input.txt >output.txt 2>&1 (означает перенаправить вывод ошибок в стандартный вывод). А можно стандартный вывод одной программы использовать, как стандартный ввод другой (используется в основном в *nix, так как там все грамотно изначально задумано): ls | sort > sort-directory-content.txt, ls - сделать листинг текущего каталога, sort - сортировать стандартный ввод.

EOF - это Ctrl-Z + Enter в Windows или Ctrl-D в *nix.

2. функция (не метод! методы - это функции-члены класса) main() определена по стандарту как int main(). Да и вообще, язык Си предполагает, что если не указан тип возвращаемого значения, то он int.
Отсутствие предупреждения при отсутствии return в main - это обход стандартной ошибки программирования. return должен быть.

Автор: Compositum 26.11.2010, 11:44
спасибо.

Автор: mes 26.11.2010, 11:46
Цитата(bsa @  26.11.2010,  10:35 Найти цитируемый пост)
Отсутствие предупреждения при отсутствии return в main - это обход стандартной ошибки программирования. return должен быть. 

имхо, скорее это адаптация под стандартизированное правило C++.. 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)