C 三元运算符

C ternary operator

在学习 C 的过程中,我遇到了一些让我完全困惑的事情。

表达式为:

exp(V*log(i))?i%2?s:s--:s++;

如果三元运算符是Question?Positive:Negative;我以为是这样的:

if(pow(i,V)==1&&(i%2)==0)
    s--;
 else
    s++;

但是s没有进入题中,请问第一个表达式是什么意思?

程序运行完美,但我不明白为什么。

原程序为:

main(){
    #define V 1

    int a, s=0, i;
    for(i=1000;i>=0;i--)
        exp(V*log(i))?i%2?s:s--:s++;
    exp(V*log(i))?printf("%d\t%d\t",-s,i):printf("%d\t%d\t", s,-i);
    getch();
}

如果 exp(Vlog(i)) 为真那么测试它是奇数 i%2==1 如果它是 return s 如果偶数 return s- - 如果 exp(Vlog(i)) 为假 return s++ 如果你这样写比更容易看到:

exp(V*log(i))?(i%2?s:s--):s++;

三元运算符测试表达式是否为真。要理解这种情况,您需要对其进行分析并将运算符的两种用法分开:

exp(V*log(i))?i%2?s:s--:s++;

这转化为

if(exp(V*log(i))
    if(i%2)
       s;
    else
       s--;
else
    s++;

唯一的区别是它是一个表达式和单个语句,而不是 if/else 版本。它始终 returns s 的当前值,但会根据条件更改它。

如果 exp 指的是指数函数,则除非输出为 -inf,否则输出将为 !=0,因此该值将计算为 true。请注意,nan 也将计算为 false,并且当值超出其域时,nanlog 的输出。

所以基本上你可以用更简单的表达式来翻译它(除非 V 为零,i==0 的值会改变):

i>0?s++:i%2?s:s--;