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