四、赋值运算符和逗号运算符
1、赋值运算符和赋值表达式
1)赋值运算符
赋值运算符是一个符号,它的含义是将等号右边的值赋给等号左边的变量
注意:等号左边必须是一个变量。
赋值可以理解成给变量一个值,执行完一条赋值语句后,变量的值就被设置为新给的值了 。
int i ; //这行叫变量声明
int i=90; //这不是赋值语句,赋值语句不可以类型名作为语句开头的,这里以int开头,定义变量i时,给了一个初始值
i=100; //这行代码是赋值语句。
赋值的原则:赋值符号左侧和右侧的数据类型应该相同,类型不同时可以用强制类型转换运算符,当用强制类型转换运算符时 ,开发者必须自己明确知道不会造成赋值后的数据溢出(要充分考虑一个类型的取值范围,因为溢出得到的结果显然不是想要的结果),如果不遵照这样的原则,可能赋值结果就是难以预料的结果。
例:
int a; //int的最大值是2147483647
a=1000000 * 1000000 //每个值都不会溢出,但结果会溢出,这样也不行,结果变得不可预料,这是容易犯的错误
2)复合的赋值运算符
在赋值运算符"="之前增加其他运算符,构成复合赋值运算符。
例:
a+=3; //等价于a=a+3
x*=y+8; //等价于x=x*(y+8);注意:*=运算符的优先级比+低,表达式 y+8 是一个整体,即相当于给 y+8 加了括号
例:
练习:
a-=5;
a%=5;
a/=5
3)赋值表达式的值
赋值表达式本身是有值的,赋值表达式的值就是赋值运算符=号右侧的值。
例:
一般来说,运算符的结合顺序(运算顺序)是从左到右,如 3+4+7,但赋值运算符的结合顺序是从右到左。
例:
int a,b,c;
a=b=c=5; //5赋给c,而后c=5的值为5,赋给b,最后,5再赋给a,相当于a=5
运算顺序问题不用多虑 ,记不清运算符优先级的时候直接用圆括号括住要优先运算的部分。
例:混合了普通赋值运算符和复合赋值运算符的代码
int a=3;
a+=a-=a*a;
a的值运算步骤:
a*a=9
a=a-(a*a) a=3-9
a=a+(a-a*a) a=-6-6
a=-12
可以增加括号:a+=(a-=(a*a))
练习:(只做为演示练习用,实际工作中,尽量不要这样写代码,别人阅读代码不友好)
int a=3;
a+=(a-=(a*a)) //a=-12
a+=(a-=9); //a=-42
a+=(a=a-9); //a=-102
a+=(a=3-9); //a=-12
a+=(a=(-6)); //a=-12
a+=(-6); //a=-18
a=a+(-6); //a=-24
4)逗号运算符和逗号表达式
逗号运算符和逗号表达式应用的场合不算太多 ,但也需要一定的了解和掌握。
逗号运算符就是一个逗号,而逗号表达式是用逗号将两个表达式连接起来构成的一个更长的表达式。
逗号运算符是优先级最低的运算符。
逗号运算符格式:
表达式 1,我达式 2,表达式 N
逗号表达式的求解过程:依次从左到右求解各个表达式的值,先求解表达式1,再求解表达式 2…,最后求表达式N,整个表达式的值是表达式N的值。
例:
并不是任何出现逗号的地方都看成是逗号表达式。
例:
printf(“%d,%d,%d",3,4,5); //3,4,5并不是逗号表达式,而是 printf 函数的参数,函数以及函数参数的概念后面再讲。