表达式与求值
在C语言中,表达式由运算符、常量及变量构成。每一个表达式,都有对应的一个值。该值与表达式中操作符的优先级和结合律有关。大家已经学习了运算符的概念,那么在本章将进一步学习各种不同的表达式。
赋值表达式,比如对于整数变量:
a = 0
就是一个赋值表达式,表达式的值就是a的值。
算术表达式:
a + b
a*b
a/b
a%b
逗号表达式:
a,b,c,d
逗号表达式是用逗号运算符将表达式连接在一起形成新的表达式。逗号表达式的格式为:
表达式1,表达式2,…,表达式n
逗号表达式的计算顺序是从左往右,逗号表达式最终的值是表达式n的值,即表达式最右边的值为逗号表达式的值。
在计算逗号表达式的值的时候,一定要注意,逗号运算符的优先级是最低的运算符,所以逗号运算符是最后参加运算的。比如考虑如下程序的输出是什么呢?
int main(void)
{
int a,b,c;
a=b=1;
c=a++,b++,++b;
printf("%d,%d,%d\n",a,b,c);
return 0;
}
首先,由于逗号运算符的优先级最低,所以也就低于赋值运算符,所以表达式:
c=a++,b++,++b
等价于:
(c=a++),b++,++b
等价于:
(c=a; a++),b++,++b
其结果为:
c=1, a=2, b= 3
所以输出应该是:2,3,1。而整个逗号表达式的值为3。
int main()
{
int a=2,b=4,c=6,x,y,z;
z=(y=(x=a+b),(b+c));
printf("y=%d,x=%d,z=%d",y,x,z);
return 0;
}
由于赋值运算符优先级高于逗号运算符,所以,应该先算x=a+b,即x=6,再算y=(x=6),即y也等于6,再算b+c,即10,所以z=(6,10),所以,z=10。于是输出为:y=6,x=6,z=10
当然,需要注意的是并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。如
printf("%d %d %d",a,b,c);
func(a, b,c);
逻辑表达式:
a&&b&&c
a||b||c
比较表达式:
a>b
a==b
a!=b
复合表达式:
a+5*b+(c>>2)
a==NULL
a==true
a==false
a==0
实数与零进行比较:
浮点运算是不精确的,运算结果本该等0的地方,有可能实际算出是0.0000001,所以,一般只要小于某个数,就认为等于0了。
float a;
…
if (a>-1e-6 && a<1e-6)
{
}
if (a == 0.0)
{
}
在实数中,用1e-6表示0。所以实数与零比较用下面的表达式:
fabs(a) == 1e-6
fabs(a) != 1e-6
fabs(a) > 1e-6
fabs(a) < 1e-6
其中fabs()是求实数的绝对值的库函数,它的头文件为“math.h”。
三元表达式求值
三元运算符A?B:C,在计算的时候,先计算A部分的值,如果A部分位真,就计算B部分的值作为整个表达式的值,否则计算C部分表达式的值,作为整个表达式的值。