Тернарный оператор не похож на оператор 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
Надеюсь, это поможет, чувак, удачи. Дайте мне знать, если у вас есть какие-либо вопросы.