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,并且当值超出其域时,nan
是 log
的输出。
所以基本上你可以用更简单的表达式来翻译它(除非 V 为零,i==0
的值会改变):
i>0?s++:i%2?s:s--;
在学习 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,并且当值超出其域时,nan
是 log
的输出。
所以基本上你可以用更简单的表达式来翻译它(除非 V 为零,i==0
的值会改变):
i>0?s++:i%2?s:s--;