使用条件运算符的二次方程

Quadratic equation using conditional operator

谁能一步一步地向我解释这个程序是如何工作的?它使用条件运算符求解二次方程。但是一团糟。

#include<stdio.h>
#include <math.h> 
int main()
{ 
     float a, b, c, d; 
     printf("Introduce the coefficients: a,b,c\n"); 
     scanf("%f %f %f", &a,&b,&c); 
     a? d=b*b-4*a*c, d>=0? 
     printf("x1=%f\tx2=%f\n",(-b- sqrt(d))/2/a, (-b+sqrt(d))/2/a):
     printf("x1=%f+i*%f\tx2=%f-i*%f\n",-b/2/a, sqrt(-d)/2/a,-b/2/a,sqrt(-d)/2/a):
     b? printf("x=%f\n",-b/2/a): c? printf("0 solutions\n"): 
     printf("identity\n"); 
     return 0; 
}

让我们从头开始。

a? d=b*b-4*a*c, d>=0? 

如果 a 不为 0,则设置 d = b2 - 4ac。 如果 d >= 0,则有两个根,我们将它们都打印出来。

printf("x1=%f\tx2=%f\n",(-b- sqrt(d))/2/a, (-b+sqrt(d))/2/a):

否则如果 d <0,我们有虚根,它们使用

打印
 printf("x1=%f+i*%f\tx2=%f-i*%f\n",-b/2/a, sqrt(-d)/2/a,-b/2/a,sqrt(-d)/2/a)):

现在这一行的最后一个冒号表示如果 a 等于 0

 b? printf("x=%f\n",-b/2/a): 

现在如果 b 不为零(记得 a 为 0 吗?),则只有一个根。如果 b 为零,那么我们转到下一个冒号

c? printf("0 solutions\n"): 
 printf("identity\n"); 

我认为剩下的应该是微不足道的。

条件运算符的语法是

condition ? expression1 : expression2

用于替代if-else语句。要理解这个程序,首先格式化条件运算符,如 if-else statements:

condition?
    expression1
:
    expression2

结果:

a?
    d=b*b-4*a*c,d>=0?
        printf("x1=%f\tx2=%f\n",(-b- sqrt(d))/2/a, (-b+sqrt(d))/2/a)
    :
        printf("x1=%f+i*%f\tx2=%f-i*%f\n",-b/2/a, sqrt(-d)/2/a,-b/2/a,sqrt(-d)/2/a)
:
    b?
        printf("x=%f\n",-b/2/a)
    :
        c?
            printf("0 solutions\n")
        :
            printf("identity\n");

然后用if-else语句替换条件运算符。为此,还要消除逗号运算符。

逗号运算符的语法是

expression1, expression2

这应该替换为更常规的复合语句:

{
    expression1;
    expression2;
}

结果:

if (a)
{
    d=b*b-4*a*c;
    if (d>=0)
        printf("x1=%f\tx2=%f\n",(-b- sqrt(d))/2/a, (-b+sqrt(d))/2/a);
    else
        printf("x1=%f+i*%f\tx2=%f-i*%f\n",-b/2/a, sqrt(-d)/2/a,-b/2/a,sqrt(-d)/2/a);
}
else
{
    if (b)
    {
        printf("x=%f\n",-b/2/a);
    }
    else
    {
        if (c)
            printf("0 solutions\n");
        else
            printf("identity\n");
    }
}

现在你可以阅读这个程序了。

我认为如果使用 if...else 而不是 ?:,功能会变得更加清晰。

if(a != 0){
    d=b*b-4*a*c; // under the root
    if( d>=0 ){
        printf("x1=%f\tx2=%f\n",(-b- sqrt(d))/2/a, (-b+sqrt(d))/2/a);
    }
    else{
        printf("x1=%f+i*%f\tx2=%f-i*%f\n",-b/2/a, sqrt(-d)/2/a,-b/2/a,sqrt(-d)/2/a);
    }
}
else {
    if( b != 0){
        printf("x=%f\n",-b/2/a);
    }
    else {
        if( c != 0){
            printf("0 solutions\n");
        }
        else {
            printf("identity\n"); 
        }
    }
}

注意:printf("x=%f\n",-b/2/a); 将除以 0。