关于表达式 运算溢出等问题

ALU的构造决定了它只能进行二元运算。那么一个复杂的表达式如何处理?
只好按优先级和结合性一点一点地做。这就产生了“中间结果”,暂存在哪里?只有内存。
内存里会有一些无名的、占一定空间的、短命的变量存在,它们稍纵即逝,由系统来管理。它们就叫做表达式的值。

表达式的值的特点

用于临时存放计算结果,如同变量;
任何表达式都有值;
表达式的值都没有名字;
它们是短命的 —— 语句结束(;)即被自动释放;
它们被临时存放在函数运行栈中;
尽管昙花一现,但它们存在过。正是它们的存在才为复杂表达式的运算建立了联系的纽带。


例如:   X = a + b * c – d ;      
运算过程为:b * c暂存于“暂1” , a + “暂1”暂存于 “暂2”,  “暂2” – d暂存于“暂3”,   X = “暂3”暂存于“暂4” ,然后全部释放。
   (用运算数栈和运算符栈图解之)


&&和||不一定会执行全部计算,所以不要在&&和||表达式中进行函数调用或赋值:

?:表达式也不会执行全部计算,所以在这个表达式中也不要进行函数调用和赋值:


注意事项:
不要进行有符号和无符号数比较 负数会转化为无符号数

浮点数:
不可将浮点变量用“==”或“!=”与任何数字比较。
    千万留意,无论是float还是double类型的变量,都有精度限制。所以定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
    假设浮点变量的名字为x,应当将 
if (x == 0.0)  // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度)。


/**********************************************/
整数存在溢出问题
int x, y, z;
 if( x + y > z) // 如果x, y都是正数,相加之后
                         //可能溢出,成为负数
       {
            …
       }
/**********************************************/
      数学中的交换律,会因为表达式的运算顺序影响而失效。例如:
 int  a = 3, b = 5 ,c , d ;
c = a * b +  ++b ;
d = ++b + a * b  ;
c和d 的值会不同,vc 会得21,而 BCB得24。这给程序员带来了噩梦!

需要注意的是:
 int x = 3;
 cout<<++x<<endl<<++x<<endl;
输出的结果是5,4

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值