表达式求值计算

在C语言中,表达式由运算符、常量及变量构成。每一个表达式,都有对应的一个值。 该值与表达式中操作符的优先级和结合律有关。表达式求值,也会经常出现在名企求职的笔试试题里。
 
1.位运算表达式求值

位运算表达式求值,需要掌握位运算的定义和整数十进制到二进制之间的转化方法。 (具体请参考: 进制转化 ) 

题目:试着计算如下表达式的值(某安全名企面试笔试题目):
1)15&240
2)10^12
3)(char)(127<<1)+1
4)(char)(-1>>1)+1
5)1<<2+3
解答: 
1)15&240=00001111 & 11110000=0
2)10^12=1010^1100=0110=6
3)(char)(127<<1)+1=(01111111<<1)+1=11111110+1=11111111=-1
4)(char)(-1>>1)+1=(11111111>>1)+1=11111111+1=0
5) 1<<2+3=1<<(2+3)=1<<5=2^5=32(注意《和+的优先级)

2.i++与++i求值

i++与++i是最经典的一类表达式求职题目。大家知道,在表达式里,i++是先取得i的值,再增加1;而++i是先将i的值加1,再取i的值。 如果i++和++i单独形成表达式,那么对于内建型别(如int,long等)2者之间没有任何区别。
i++;
++i;
在C++里,++i的效率要比i++的高一些。具体原因请参考 i++与++i  

当然,如果是将i++和++i放在赋值表达式里,比如:

int i = 10;
int a = i++;//此时,i先将10赋值给a,然后再加1得11。
printf("a=%d,i=%d\n", a,i);//所以此处输出为10,11

i = 10;
a = ++i;//此时,i先加1得11,再将11赋值给a

printf("a=%d, i=%d\n", a,i);//所以此处输出为11,11
或者将i++和++i放到函数参数里,比如:
void func(int i)
{
    printf("%d\n",i);
}
int i = 10;
func(i++);//此时,i先将10传递给函数func,然后再加1,所以函数内部打印为10
i=10;
func(++i);//此时,i先加1得11,再将11传递给函数func,所以函数内部打印为11

3.逗号表达式求值

逗号表达式是用逗号运算符将表达式连接在一起形成新的表达式。逗号表达式的格式为:
                                                  表达式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(void)
{
    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

思考题

试分析如下程序执行的结果:

int i = 10;
printf("%d,%d,%d,%d\n", i++,++i,i--,--i);
提示:从函数参数传参顺序与参数表达式求值顺序角度分析
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值