Порядок вычисления в логических выражениях. - C (СИ)
Формулировка задачи:
Мне стыдно такое спрашивать, но всё же. Что-то нагуглить не получается.
Есть выражение вида
Гарантируется ли, что
A || B
B
не будет вычислен в том случае, еслиA == true
? Т.е. компилятор не может по своему желанию переставить аргументы? Интересует поведение и вC
и вC++
.Решение задачи: «Порядок вычисления в логических выражениях.»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> int my_exit(int code) { fprintf(stderr, "Something's wrong...\n"); exit(1); return code; } int main() { if(1 || my_exit(0)) printf("Hello, World!\n"); exit(0); }
Объяснение кода листинга программы
В этом коде есть две функции: my_exit
и main
.
- Функция
my_exit
принимает целочисленный аргументcode
и выполняет следующие действия:- Выводит сообщение об ошибке в стандартный поток ошибок (stderr):
Something's wrong...\n
. - Вызывает функцию
exit
с аргументом 1, что приводит к завершению программы с кодом ошибки 1. - Возвращает значение аргумента
code
.
- Выводит сообщение об ошибке в стандартный поток ошибок (stderr):
- Функция
main
выполняет следующие действия:- Проверяет условие
1 || my_exit(0)
. Логическое ИЛИ возвращает истину, так как1
истинно, а результат вызова функцииmy_exit
с аргументом 0 (что приводит к возврату 1) также истинно. Таким образом, выполняется блок кода после этого условия. - Выводит сообщение
Hello, World!\n
в стандартный поток вывода (stdout). - Вызывает функцию
exit
с аргументом 0, что приводит к завершению программы без ошибок. Список действий:
- Проверяет условие
- Вызов функции
my_exit
с аргументом 0. - Вывод сообщения
Something's wrong...\n
в стандартный поток ошибок. - Вызов функции
exit
с аргументом 1. - Возврат значения аргумента 0.
- Проверка условия
1 || my_exit(0)
. - Вывод сообщения
Hello, World!\n
в стандартный поток вывода. - Вызов функции
exit
с аргументом 0. - Завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д