前言
就是蛮简单的一道题被爱自学的我弄复杂了
试用单分支结构设计一判断用户输入值 x,当 x 大于零时求 x 值平方根运算否则不做任何操作的程序
# include <iostream>
# include <cmath>
int x;
int main (){
cin>>x;
if (x>0) cout<<sqrt(x);
else cout<<x;
return 0;
}
我就想着直接用printf
判断输出
正文
既然是判断输出,那么我就直接初次上手三元运算符
,于是就写成了这样:
printf(x>0 ? "%f" : "%d", pow(x, 0.5), x);
我想:printf
先把占位符1
替换成替换符1
,再把占位符2
替换成替换符2
,然后三元运算符
再判断输出。
结果发现当
x
<
0
x<0
x<0时,程序输出0
!
经过我的不断试错,我最终
发现printf
是先执行三元运算符
,再替换占位符
。 所以:
当 x > 0 x>0 x>0,程序相当于为printf("%f", pow(x, 0.5), x);
,然后再把pow(x, 0.5)
给%f
,舍弃x
;
当 x < 0 x<0 x<0,程序相当于为printf("%d", pow(x, 0.5), x);
,然后再把pow(x, 0.5)
给%d
,舍弃x
。(因为补码
,printf
强转最后会得到0
)
于是,我又改成了这样:
printf(x>0 ? "%f" : "%d", x>0 ? pow(x, 0.5) : x);
可发现输出还是0
。
后来问了老师才知道,
printf()
函数分为格式化输出
和数据传出
两个部分,不能对格式化输出部分
进行运算(或判断)。所以三元运算符
只得加在数据传出部分
(运算同理)。
因此我们只能写成这样:
printf("%f", x>0 ? pow(x, 0.5) : (double)x);
注意,
pow(x, 0.5)
为double
类型,x
为int
类型,所以x
需要强制转换为double
类型。
总结
printf
函数分为格式化输出
和数据传出
两个部分,只有数据传出部分
有运算(或判断)功能。