C三元运算符

时间:2015-06-18 00:58:33

标签: c ternary-operator

在学习C的过程中,我遇到的事情让我的思绪完全混乱。

表达式是:

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

如果三元运算符是问题?正面:负面;我认为它是这样的:

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();
}

2 个答案:

答案 0 :(得分:1)

如果exp(V log(i))为真,那么测试是奇数i%2 == 1如果是返回s,如果甚至返回s--如果exp(V log(i) ))是错误的返回s ++ 如果你这样写它比更容易看到:

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

答案 1 :(得分:1)

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

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

这转换为

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

唯一的区别是它是一个表达式和一个语句,而不是if / else版本。它总是返回s的当前值,但会根据条件进行更改。

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

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

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