Распечатать выписку в условии if, switch и while c - PullRequest
0 голосов
/ 14 января 2020

Может кто-нибудь объяснить, почему код печатает «HelloWorld», а не «HelloWorldThere»? Кроме того, почему он вообще что-либо печатает, поскольку в операторах if или switch нет условий? Вот код:

#include <stdio.h>

int main()
{
    int a, b;

    if(printf("Hello"))
        switch(printf("World"))
            while(printf("There"))
            {
                return 0;
            }
}

Ответы [ 2 ]

7 голосов
/ 14 января 2020

Довольно просто: printf("Hello") возвращает 5 (количество написанных символов). 5 не равно 0, поэтому он считается «истинным» для целей if, поэтому printf("World") также возвращает 5, коммутатор ищет case 5:, не находит его и останавливается там.

5 голосов
/ 14 января 2020

Для начала давайте рассмотрим, что возвращает функция printf. Из C Standard

3 Функция printf возвращает количество переданных символов или отрицательное значение, если произошла ошибка вывода или кодирования.

Так условие этого if оператора

if(printf("Hello"))

оценивается как истинное, поскольку printf() возвращает ненулевое значение.

Тогда этот switch оператор

switch(printf("World"))

оценивается.

Теперь давайте рассмотрим, как работает оператор switch. Из C Standard

4 Оператор switch заставляет элемент управления переходить к инструкции, являющейся телом переключателя, или переходить от нее, в зависимости от значения управляющего выражения и от наличие метки по умолчанию и значений любых меток дел на или в теле переключателя. Метка регистра или значения по умолчанию доступна только в ближайшем включающем операторе switch.

Так как инструкция body оператора switch не имеет метки (включая метку по умолчанию), то элемент управления передается мимо тела заявления. То есть оператор while (который является оператором тела оператора switch) не выполняется.

Если вы хотите получить ожидаемый вами результат, то, например, вставьте метку default .

#include <stdio.h>

int main()
{
    if(printf("Hello"))
        switch(printf("World"))
            default: while(printf("There"))
            {
                return 0;
            }
}

В этом случае выходные данные программы будут

HelloWorldThere

Или использовать нулевой оператор как оператор тела оператора switch.

#include <stdio.h>

int main()
{
    if(printf("Hello"))
        switch(printf("World")); // <==
            while(printf("There"))
            {
                return 0;
            }
}
...