前几天有网友提问了一个C语言printf()函数问题,测试后发现原来自己也无法解释。所以向各位网友

前几天有网友提问了一个C语言printf()函数问题,测试后发现原来自己也无法解释。所以向各位网友求助。
问题是如何解释为何一下语句运行结果是0:
printf("%f", 4/3);
为何4/3没有发生Integer promotion?
即,得到的结果为何与
printf("%f",(double)(4/3));
不同?

首先,Integral promotion不是用在这个场合。promote顾名思义就是从低精度转到高精度,也就是char, short等在可以用int表示时全部转换为int,还不够就uint;

其次,自动类型转换中,表达式的变量和结果是一律提升到表达式中精度最高的一级,对于4/3,
就是int/int,结果应当是int,就算是float a=4/3也没用。除非其中至少一个变量是float,例如(float)4/3,4.0/3,4.0/3.0等float/int或者float/float才能得到float结果1.333333,(float)(4/3)都没用。追问

其实在此之前我就已经考虑过可能不是由Integer promotion引起,而是printf()的处理逻辑造成。

printf("%f\n", 100);

问题是这种处理是C语言标准中的要求,还是Impliment defined,甚至是undefined?

还有printf()中的“%f”表示的是double。而只有scanf()中的“%f”表示float,“%lf”才表示double。

追答

你说的是对的。所以你在纠结什么呢?

追问

我纠结的是printf()函数中的这种表现,到底是ISO C中的明确定义吗?MinGW和VC++ 6的Impliment defined?还是ISO C中留有空间的undefined?

追答

stdio本来就不是C标准里面的东西。这个表现很正常啊,float的存法和int的存法就算兼容,也肯定不完全一样,double那就更不一样了,不对应的输出格式肯定不工作嘛。这并没有什么好纠结的,就是这么用的,别人定了标准就入乡随俗。printf这种东西只能说是调试啊什么的时候顺手写的,真正写软件的甚至写底层的才不会去管什么格式不格式,软件输出成这个丑样子用户肯定不满意,底层直接调用驱动,关printf毛事。
printf之于C就像科学仪器之于科学,前者只是利用后者的原理制造的一个工具,以便更能方便地研究后者;但前者并不是后者主要的组成部分,没有前者,后者同样存在,并且可以以其他的方式被应用。所以,纠结printf为什么会这样就想在纠结为什么用电压表不能测电流,虽然这种现象自有它的原理,但并无太大意义,也就是就算知道为什么,也不能给你什么有价值的启发,还不如用这个时间去多读两本书。工具该怎么用就怎么用,应该赶快用好工具,然后去研究更深层的东西。我觉得计算机语言真正的内涵在于算法,是怎样才能算得出、算得快,而不是怎样才能把结果表示出来。
如果满意请采纳,如有问题欢迎继续探讨。

温馨提示:答案为网友推荐,仅供参考
相似回答