Прежде всего потому, что выражения в C также дают значения. Например: x = 1;
возвращает значение 1. Иногда вы используете это для многократного назначения, например x = y = 1;
, но чаще вы этого не делаете.
В раннем C тип возврата void
также не был изобретен, поэтому каждая функция возвращала какое-то значение, было ли оно вообще полезным или нет (например, ваш вызов printf
также возвращает значение).
Правила языка не делают это ошибкой (из-за этого теряется совместимость с практически существующим кодом), и поскольку это часто встречается и редко указывает на проблему, большинство компиляторов также не предупреждают об этом. Это делают несколько инструментов lint, что привело к тому, что несколько ошибочных программистов написали что-то вроде (void)printf("whatever");
(то есть приведение неиспользованного возврата к void
, чтобы сигнализировать о том, что оно действительно, действительно было преднамеренным, когда его игнорировали. Однако это редко приносит какую-то пользу и часто приносит немало вреда, поэтому (к счастью) его редко можно увидеть.