C把赋值运算符连接而成式子叫做赋值表达式例如:a=b、a=b+c、a=3等赋值运算符是个双目运算符必须两个参和运算值其左边值叫做l-value通常是变量或赋值表达式常量和常变量不可以作为赋值表达式左值赋值运算符右端值叫做r-value通常个常量、变量或表达式
C把逗号运算符连接式子叫做逗号表达式例如:“aa*3”“b+3d/4”等逗号表达式右被称为顺序求值表达式它值是最右端表达式值例如有如下逗号表达式:
a*=5a+2
假设a=3该逗号表达式求值步骤是先计算左侧表达式a*=5结果是a=15然后计算右侧表达式a+2值是17整条逗号表达式值为17
把赋值符和逗号连接式子作为表达式看待是C特点的引入赋值表达式和逗号表达式使C语句变得十分灵活丰富合理使用赋值表达式和逗号表达式可以大大精简代码使更紧凑下面我们来看看使用这两种表达式时窍门技巧和应当注意到问题
1:
# <iostream>
using std;
{
unsigned a;
b=-1;
a=b;
cout<<a<<endl;
0;
}
大家可以先猜测下运行结果
运行结果为65535为什么是这个结果呢?其实仔细想想很容易得出答案:我们知道型变量在内存中是占两个字节即16个 2进制位因此用-1给b赋值以后b中值就是1111,1111,1111,1111 【注】然后将其赋给a a所占内存也是16位原封不动全部搬过去 a值也变成1111,1111,1111,1111 a是无符号数它所有位都表示数值1111,1111,1111,1111对应十进制数即使65535因此输出结果就是65535
【注】:所谓补码就是将该负数绝对值原码取反后最低位加1得到 2进制编码例如求取-3补码步骤如下:
第步:计算出3原码:0000,0000,0000,0011
第 2步:将3原码取反:1111,1111,1111,1100
第 3步:将取反后原码加1:1111,1111,1111,1101
1111,1111,1111,1101即是-3补码
例1运行结果给了我们个警示——区别类型变量相互赋值时定要考虑他们编码形式即值域范围否则可能得到和我们期望相差十万 8千里结果
例2:
# <iostream>
using std;
{
a=3;
a4;
cout<<a<<endl;
0;
}
这个例子无甚特别的处它仅仅介绍说明了赋值运算符可以跟基本运算符组合成为符合赋值运算符常见到组合方式有、-=、*=、/=、%=、<<=、>>=、&=、|=、∧=有关这些符合赋值运算符使用方法此处不作介绍大部分教授C基础书上都有不清楚可以自己去查看下面我们来看个有趣问题有如下表达式:
a=5*8,a*10
问该表达式值是多少?
讨论对该表达式求解可能会有两种区别声音:其认为a=5*8是个赋值表达式它跟后面a*10起构成了个逗号表达式所以求解时先算出a=5*8值然后计算a*10值;另种声音认为5*8,a*10是个逗号表达式应当先求这个逗号表达式值然后将逗号表达式值赋给a倒底那种理解对呢?这就需要查考两种运算符运算优先级了赋值运算符优先级要高于逗号运算符因此对表达式a=5*8,a*10求解应该是先计算a=5*8然后计算逗号表达式值
例3:
# <iostream>
using std;
{
a;
a=3;
cout<<(aa=aa)<<endl;
0;
}
问输出结果是多少?
很多人见到诸如aa=aa这样表达式时还没研究先就头脑发晕了其实大可不必这么惶恐冷静下来仔细想想这个表达式还是很容易求解要求解这个表达式需要知道个先决条件——赋值运算求值顺序赋值运算都是从右至左求值知道了这点问题就迎刃而解了下面是对该表达式求解过程:
第步:计算最右端aa结果为6;
第 2步:将aa值赋给前个aa变为6;
第 3步:计算最左端aa结果为1212即为整个表达式值
好了现在大家对连续多次赋值赋值表达式求解应该没有问题了不过上例中还有个需要注意地方不知道大家有没有留意 cout语句中 “aa=aa”是加括号在用cout输出赋值表达式或逗号表达式值时定要用括号将整个表达式括起来否则编译会出错这主要是C输出流对象ostream中没有处理赋值运算符和逗号运算符机制如果你重载了<<运算符实现了这个机制就可以不要括号了(不过要重载<<实现输出赋值表达式是个比较复杂问题远不如加个括号来得轻快,因此牢记输出赋值或逗号表达式时定要用括号把正个表达式括起来)
整理总结赋值表达式和逗号表达式通常使用方法:
、赋值表达式使用方法:
1. 用于对多个变量赋值如:a=b=c=d=3;
2. 用于条件语句条件如:(a=fun(x,y)){}这时相当于执行
a=fun(x,y);
(a){}
赋值表达式通常用于以上两种情况但不限于此灵活运用赋值表达式可以极大精简代码使更加紧凑更多使用方法请自己去研究
2、逗号表达式使用方法:
1.用于顺序求值如:a=bb=cc=d; 相当于执行:
a=b;
b=c;
c=d;
3. 用于条件语句如:(a=fun(x,y),a>0){}这时相当于执行
a=fun(x,y);
(a>0){}
条件表达式通常用于以上两种情况但不限于此逗号语句最大特点在于它可以在条语句中整合多种区别类型表达式用条语句实现多个功能例如有如下可编译执行:
# <iostream>
using std;
{
i;
cout<<3<<endl,i=4*8,cout<<i<<endl;
0;
}
逗号表达式极大增强了C语句灵活性使用逗号表达式可以精简代码希望大家在编程过程中灵活使用逗号表达式简化自己从代码使代码更紧凑更具可读性
最新评论