Условие else выводит что-либо, когда printf используется в тернарном операторе. Почему? - PullRequest
0 голосов
/ 14 апреля 2019

Другая часть в троичном операторе, которая является оператором printf, не работает в коде, правильный синтаксис? Или какая-то глупая ошибка?

#include<stdio.h>
#define isNegative(x) x<0 ? 1 : 0
#define isPositive(x) isNegative(x) ? 0 : 1
#define isEven(x) x%2 ? 0 : 1
#define isOdd(x) isEven(x) ? 0 : 1
main(){
 int n,ch;
do{
printf("Enter a number\n");
scanf("%d",&n);
printf("Choose an operation :\n 1.isEven\n 2.isOdd\n 3.isPositive\n 4.isNegative\n");
scanf("%d",&ch);
switch(ch){
case 1 :isEven(n) ? printf("Its even number\n") : printf("Its not an even number\n") ;
        break;
case 2 :isOdd(n) ? printf("Its odd number\n") : printf("Its not an odd number\n") ;
        break;
case 3 :isPositive(n) ? printf("Its a positive number\n") : printf("Its not a positive number\n");
        break;
case 4 :isNegative(n) ? printf("Its a negative number\n") : printf("Its not a negative number\n");
        break;
default : printf("Enter valid option\n");
        break;
}
printf("Press 5 to continue or 6 to exit\n");
scanf("%d",&ch);
}while(ch!=6);
}

Правильна ли логика кода?содержимое заголовочного файла

1 Ответ

1 голос
/ 14 апреля 2019

Тернарный оператор не похож на оператор if - then - else; это выражение само по себе, что означает, что его значение - это то, что оценивается обычным способом. Вы не можете видеть это в своем коде, потому что результат использованных выражений троичных операторов не фиксируется никем. Это то, что в C ++ называется rvalue.

Вы можете доказать это себе, сделав следующее:

size_t i = 1;    
(i == 2) ? printf("hello\n") : printf("goodbye\n")

Выход:

goodbye

Здесь мы снова оцениваем предикат и оцениваем выражение "else". Выход, что неудивительно, составляет goodbye. Но это еще не все.

Многие люди не понимают, printf имеет возвращаемое значение. Он возвращает количество символов, записанных в стандартный вывод или, в случае fprintf, в любой поток вывода, который вы укажете. Как и функции scanf, printf s вернет отрицательное число в случае ошибки. Вот почему важно проверить возвращаемое значение scanf. К сожалению, многие люди не понимают, что эти функции имеют возвращаемые значения, поэтому, очевидно, они не проверяют, что они не знают, существуют.

В следующем примере вы можете ясно увидеть возвращаемое значение троичного выражения.

size_t i = 1;    
int result = (i == 2) ? printf("hello\n") : printf("goodbye\n");
printf("Result: %d\n", result);

Выход:

goodbye
Result: 8

Возвращаясь к фактическому троичному оператору, хочу подчеркнуть, что это выражение . Подобные вещи вы часто видите в функциональных языках программирования, хотя и не в той же «форме», если хотите. Тот факт, что функция printf печатает на стандартный вывод, является так называемым побочным эффектом, а концепция уменьшения побочных эффектов в максимально возможной степени при сохранении полезного языка программирования является одной из основ функционального программирования.

<ч />

Чтобы ответить на ваш конкретный вопрос:

Правильна ли логика кода?

Я переформатировал часть кода и добавил значительное количество скобок. Вы должны быть очень осторожны, когда работаете как с макросами, так и с троичными операторами, чтобы получить правильные скобки, иначе вы получите такие ошибки.

#include <stdio.h>

#define isNegative(x) x<0 ? 1 : 0
#define isPositive(x) isNegative(x) ? 0 : 1
#define isEven(x) x%2 ? 0 : 1
#define isOdd(x) isEven(x) ? 0 : 1

int main()
{
    int n, ch;

    do {
        printf("Enter a number\n");
        scanf("%d", &n);

        printf("Choose an operation :\n 1.isEven\n 2.isOdd\n 3.isPositive\n 4.isNegative\n");
        scanf("%d", &ch);

        switch (ch) {
            case (1): ((isEven(n)) ? printf("Its even number\n") : printf("Its not an even number\n"));
                break;
            case (2): ((isOdd(n)) ? printf("Its odd number\n") : printf("Its not an odd number\n"));
                break;
            case (3): ((isPositive(n)) ? printf("Its a positive number\n") : printf("Its not a positive number\n"));
                break;
            case (4): ((isNegative(n)) ? printf("Its a negative number\n") : printf("Its not a negative number\n"));
                break;
            default: printf("Enter valid option\n");
                break;
        }

        printf("Press 5 to continue or 6 to exit\n");
        scanf("%d",&ch);
    } while(ch != 6);

    return EXIT_SUCCESS;
}

Исполнение:

Enter a number
5
Choose an operation :
 1.isEven
 2.isOdd
 3.isPositive
 4.isNegative
4
Its not a negative number
Press 5 to continue or 6 to exit
5
Enter a number
3
Choose an operation :
 1.isEven
 2.isOdd
 3.isPositive
 4.isNegative
3
Its a positive number
Press 5 to continue or 6 to exit

Надеюсь, это поможет, чувак, удачи. Дайте мне знать, если у вас есть какие-либо вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...