《C语言解惑》—— 3.1 混合运算要小心

3.1 混合运算要小心

【例3.1】分析下面程序的输出结果。

#include <stdio.h>
void main()
{
       double a=2,b=6;
       int c=2,d=6;
       printf("%f\n",a/b);        //1
       printf("%f\n",2/6);        //2
       printf("%f\n",2./6);       //3
       printf("%f\n",(double)c/d);    //4
       printf("%f\n",(double)(c/d));  //5
       printf("%f\n",(double)(c/b));  //6
       printf("%d\n",2/6);        //7
       printf("%f\n",c/b);        //8
}

第2条语句的“2/6”与第7条语句的“2/6”是一样的,都是两个整数相除,结果为0,只是第2条语句用实数输出,为0.000000,第7条语句用整数输出,为0。第5条输出语句只是将整数“2/6”的结果转换为实数,整数相除的结果为0,当然输出与第2条语句一样。
第6条语句对“c/b”的结果进行转换是多余的,因为“c/b”已经是混合运算,自动实现转换,与第8条语句等效。第3条语句也是实数和整数的混合运算,它们的结果都与第1条语句的结果一样,均输出0.333333。程序的输出为
0.333333
0.000000
0.333333
0.333333
0.000000
0.333333
0
0.333333
整型、单精度、双精度型数据可以混合运算,字符型数据可以与整型数据通用。因此,整型、实型(包括单、双精度)、字符型数据间可以混合运算。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换规则是:字符型必须先转换为整数,short型转换为int型,float型数据在运算时一律先转换成双精度型;int型与double型数据进行运算,先将int型数据转换成double型,结果为double型;同理,int型与long型数据进行运算,先将int型转换成long型,结果为long 型。
【例3.2】演示字符和整数的运算程序。

#include <stdio.h>
void main()
{
       char a='a';   int i=97;
       printf("%c %c %c\n",a,(a+1),(a+2));
       printf("%c %c %c\n",i,(i+1),(i+2));
       printf("%d %d %d\n",a,(a+1),(a+2));
}

在VC中,第1条语句与下面的语句
printf("%c %c %c\n",a,a+1,a+2);
是等效的。之所以不用这种形式,是因为有的C编译器对“a+1”和“ (a+1)”的处理方式不一样,效果也就不一样。根据混合运算规则,可以分析出程序输出的结果如下。
a b c
a b c
97 98 99
【例3.3】分析下面程序中的错误。

#include <stdio.h>
void main()
{
      int a=97; double b=25;
      printf("%d\n",a%b);
}

运算符%只适用于整数,需要对b强制转换,即“a%(int)b”,变成97%25=22。

意 不能将形如“b=25”的b误认为整数,它是25.000000,不符合求余的运算要求。

时间: 2024-08-01 15:51:42

《C语言解惑》—— 3.1 混合运算要小心的相关文章

《C语言解惑》—— 导读

前 言 C语言编程仍然是编程工作者必备的技能.目前有四类典型的学习C语言的教材:第一类是以讲授语法为主线,即流行的教科书方式,所涉及的例题均以正确的程序为主:第二类是以案例教学为主的教材,摆脱了语法的部分约束:第三类是以讲解编程技术为主的经验之作,主要针对已有编程基础的读者:第四类是针对编程容易产生错误的专题,对比正确与错误的程序以提高编程能力,涉及的内容比较专业.这些教材各有千秋,其共同的目的都是想教会读者如何编写正确.规范的程序.我们也曾在两部教材的每一章中尝试增加一节错误分析的内容,以期让

《C语言程序设计与实践(第2版)》——3.5 各类数值型数据间的混合运算

3.5 各类数值型数据间的混合运算 在C语言中,允许不同类型的数据之间进行某些混合运算.前面提到,字符型数据可以和整型通用.不仅如此,C语言还允许整型.单精度型.双精度型.字符型的数据之间进行混合运算.例如, 是合法的.在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算.转换的规则如图3-2所示. 图3-2中横向向左的箭头表示必定的转换,如字符型(char)参加运算时,不论另一个操作数是什么类型,必定先转换为整型(int):short型转换为int型,单精度(float)型数据在运算时

《C语言解惑》一第1章 操作符1.1 基本算术操作符

第1章 操作符 C语言解惑 C语言程序由语句构成,而语句由表达式构成,表达式又由操作符和操作数构成.C语言中的操作符非常丰富--本书的附录B所给出的操作符汇总表就是最好的证据.正是因为这种丰富性,为操作符确定操作数的规则就成为了我们理解C语言表达式的核心和关键.那些规则--即所谓的"优先级"和"关联性"--汇总在本书附录A的操作符优先级表里.请使用该表格来解答本章中的谜题. 谜题1.1 基本算术操作符 请问,下面这个程序的输出是什么? main() { int x;

实现四则混合运算的代码

运算 这是一个实现四则混合运算的代码,包括三个方法,调用时,使用Compute()方法即可,这个方法可以用于动态计算. 代码:         string Precede(string p, string q)       {           switch(p)           {              case "+":              case "-":                  return ("*/(".I

用于计算四则混合运算表达式的递归函数第二版

用于计算四则混合运算表达式的递归函数第二版 更新于2007-08-28 by billow3(QQ:41965573) 注:本文在发表时稍作了排版,如果有因排版引起的代码工作不正常请来信告知我们 #include <math.h>#pragma warn -8060 // 屏蔽编译时的 Possibly incorrect assignment 警告AnsiString __fastcall Calc(String sExp){ // 计算不带变量的四则混合运算表达式(支持取整int和圆整ro

《C语言解惑》一导读

前言 C语言解惑 C语言并不大--如果以参考手册的篇幅作为衡量标准的话,C语言甚至可以归为一种"小"语言.不过,这种"小"并不意味着C语言的功能不够强大,而是说明了C语言里的限制性规则比较少.C语言本身的设计非常简洁精妙,这一点相信C语言的使用者早已有所体会. 不过,C语言的这种精妙对C语言的初学者来说,似乎是故作神秘.因为限制较少,C语言可以写成内容丰富的表达式,这可能会被初学者认为是输出错误.C语言的紧凑性允许以简洁凝炼的方式实现常见的编程任务. 学用C语言的过

存放的地方-C语言3目表达式的运算结果是放在寄存器的吗?那其他的表达式的结果呢?

问题描述 C语言3目表达式的运算结果是放在寄存器的吗?那其他的表达式的结果呢? C语言3目表达式的运算结果是放在寄存器的吗?那其他的表达式的结果呢? 解决方案 运算结果放在哪里是编译器决定的,而不是编程语言决定的.没有规定?:运算表达式的结果一定放在寄存器 解决方案二: 举例: int i = true ? 1 : 2; 因为这是一个常量表达式,因此编译器直接得到int i = 1; 根本就不会产生判断的代码,也不用到什么寄存器.

JAVA写的四则混合运算

运算 近来用JAVA写了一个小程序,不敢独享.这是一个四则混合运算程序,没什么做优化,也没做什么注释,(人啊,总喜欢偷懒的.) 这个版本我已经定为了2.21版本.呵呵. 从最先的1.0到2.0的改动很大.除了运算思想没动处,其它的都在2.0做了重新设计. 这种程序其实网上一大把(算法也好得多).此仅为无聊找点事情做而已. /***四则混合运算程序*作者:黄剑武*时间:2005年4月29日*版本:2.21*修改日志:2.0* 1.更改表达式用户输入方式.* 2.对用户输入的表达式进行有效性字符过滤

《迷人的8051单片机》----第3章 入门C语言 3.1数据和运算

第3章 入门C语言 单片机是一种可编程的器件,我们需要将程序预先编写好,并保存到单片机的存储器中,单片机才能按照预先的设定执行程序.在给单片机开发应用程序时,使用C语言编写代码已经是一种趋势,C语言博大精深,学精不易,但入门却十分简单,本章将带领你用最便捷的方式快速学习C语言,并且在短时间内学会编写C应用程序. 3.1 数据和运算 3.1.1 C语言的由来 语言是编写程序时人与单片机之间的交流方式,最初人们使用机器码(0与1组合)来给单片机编写程序,后来开始使用汇编语言来编写程序,汇编语言和单片