当printf用于三元运算符时,else条件会打印任何内容。为什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当printf用于三元运算符时,else条件会打印任何内容。为什么?相关的知识,希望对你有一定的参考价值。

三元运算符中的else部分是一个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
");
scanf("%d",&n);
printf("Choose an operation :
 1.isEven
 2.isOdd
 3.isPositive
 4.isNegative
");
scanf("%d",&ch);
switch(ch){
case 1 :isEven(n) ? printf("Its even number
") : printf("Its not an even number
") ;
        break;
case 2 :isOdd(n) ? printf("Its odd number
") : printf("Its not an odd number
") ;
        break;
case 3 :isPositive(n) ? printf("Its a positive number
") : printf("Its not a positive number
");
        break;
case 4 :isNegative(n) ? printf("Its a negative number
") : printf("Its not a negative number
");
        break;
default : printf("Enter valid option
");
        break;
}
printf("Press 5 to continue or 6 to exit
");
scanf("%d",&ch);
}while(ch!=6);
}

代码的逻辑是否正确?头文件的内容

答案

三元运算符不像if-then-else声明;它本身就是一种表达,这意味着它的价值就是以通常的方式评估的东西。您无法在代码中看到它,因为您使用的三元运算符表达式的结果未被任何人捕获。这就是C ++中所谓的rvalue

你可以通过这样做来证明这一点:

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

输出:

goodbye

这里我们再次评估谓词并评估“else”表达式。毫不奇怪,输出是goodbye。但这不是全部故事。

很多人都没有意识到printf有回报价值。它返回写入stdout的字符数,或者在fprintf的情况下返回指定的任何输出流。与scanf函数一样,printfs将在错误上返回负数。这就是检查scanf的返回值很重要的原因。不幸的是,许多人没有意识到这些功能有返回值,所以显然他们不会检查他们不知道存在什么。

但是,通过下一个示例,您可以清楚地看到三元表达式的返回值。

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

输出:

goodbye
Result: 8

回到实际的三元运算符,我想强调它是一个表达式。你会在函数式编程语言中经常看到类似这样的东西,尽管你不会在同一个“形状”中。 printf函数正在打印到stdout这一事实被称为副作用,尽可能减少副作用同时仍然具有有用的编程语言的概念是函数式编程的基础之一。


要回答您的具体问题:

代码的逻辑是否正确?

我重新格式化了一些代码,并添加了大量的括号。当你使用宏和三元运算符来使括号正确或者你会得到这样的错误时,你必须非常小心。

#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
");
        scanf("%d", &n);

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

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

        printf("Press 5 to continue or 6 to exit
");
        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

希望这有帮助,伙计,祝你好运。如果您有任何疑问,请告诉我。

以上是关于当printf用于三元运算符时,else条件会打印任何内容。为什么?的主要内容,如果未能解决你的问题,请参考以下文章

三元运算

三元运算符

Python-三元运算符和lambda表达式

三元运算符

三目运算

三元运算