赋值运算符和赋值表达式:
优先级 | 运算符 | 功能 | 结合方式 |
14 | = += -= *= /= &= ^= |= <<= >>= | 各种赋值 | 由右向左 |
赋值表达式:
<变量><赋值运算符> <表达式>
如:
int a;
a = 3;
赋值运算符的作用是:使<左值>=<右值>
如a=3;这条语句中:a是左值,=是赋值运算符,3是右值。这条语句的执行结果便是使a的值变为3。
注:左值常为变量,而不能是常量(给左值赋值实际上是给左值所代表的内存空间中存放值,而常量没有可以存放值的内存空间)。
赋值过程中,一些数据类型会自动转换,如:
左值 | 右值 | 转换方法 | 举例 |
整型变量 | 浮点型数据(单、双精度) | 浮点数舍弃其小数部分 | int a; a=4.38; 等效于:a=4; |
浮点型变量 | 整型数据 | 数值不变,以指数形式存储 | double d; d=375; 等效于:d=375.000000 |
float变量 | double型数据 | 精度降低,可能溢出 | float f; f=2.8e59; 因为float存储数据的精度和double不同,所以存储进去是2.8e59,取出来可能会有所偏差(精度降低)。 并且因为存储不了这么大的数据,所以取出来可能会变小,甚至可能整个数都变的很荒谬(数据溢出)。 |
unsigned型变量 | 长度相同的signed型数据 | 原样照搬,但原符号位也作为数据部分对待 | unsigned int u; u=-32765; 等效于:u=4294934531 |
注:这里的数值自动转换规则在以前写的博文中已经做过描述了。所以这里不再解析。
复合的赋值运算符:
形式: += , -= , *= , /= , %= , <<= , >>= , &= , ^= , |=
举例解析:
#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试复合赋值运算符
*/
int main()
{
int a=0;
int b=0;
a+=3;
b=b+3;
printf("a=%d\nb=%d\n",a,b);
int x=1;
int y=2;
x*=y+8;//等价于x=x*(y+8);
printf("x=%d\n",x);
x%=3;//等价于x=x%3;
printf("x=%d\n",x);
return 0;
}
结果:
解析:
1.a+=3其实就是a=a+3的缩写,上方示例中a和b的输出值相等验证了这一点。
2.同理,-= , *= , %= 都是类似这样的缩写,是为了提高代码的效率创造出来的。
赋值语句与赋值表达式:
赋值语句:a=3; b+=6.32;
赋值表达式:a=3 b+=6.32
注:
1.赋值语句和赋值表达式最直观的区别就是结尾的分号,作为一条独立的语句,赋值语句结尾必须加分号。
2.赋值表达式和赋值语句的功能基本相近,同样能实现给变量赋值的工作。但他们的区别是:
赋值表达式可以作为一个确定的值来使用,并且赋值表达式的值就是赋予左值的值。
例如:b=(a=3); 这里(a=3)就是一个赋值表达式,并且这个赋值表达式的的值是3。所以这条语句执行的结果将是:给a赋值为3,并给b赋值3。
代码说明:
#include <stdio.h>
#include <stdlib.h>
/*
这个程序用于测试赋值表达式的作用
*/
int main()
{
int a,b,c;
printf("%d\n",(a=5));//这里,a=5就是一个赋值表达式
printf("%d\n",(b=(c=6)));//这里,c=6和b=(c=6)都是赋值表达式,相当于一个赋值表达式中嵌套了另一个赋值表达式
printf("%d %d %d\n",a,b,c);
return 0;
}
结果:
解析:
1.上方代码中有一段:b=(c=6),可以由此验证出:
赋值表达式:<变量> <赋值运算符> <表达式> ;中的<表达式>可以是另一个赋值表达式(或其它有确定值的东西)
2.有一种赋值表达式:(a=3*5)=4*3; 这样的语句其实也是可以的,因为(a=3*5)作为一个赋值表达式虽然有确定的值,但要明白他实际上仍是一个变量,这个语句可以解析为:
a=3*5; a=4*3;
3.如果a=5,并且表达式是:a+=a-=a*a;的话,结果是什么样的?只要记住:赋值表达式的计算顺序遵循从右到左。
按照顺序计算下来:a*a=25;a-=25得a=-20;a+=-20得a=-40;
所以结果是a=-40,且表达式的值也为-40。
逗号运算符和表达式:
优先级 | 运算符 | 功能 | 结合方式 |
15 | , | 分隔表达式 | 由左向右 |
逗号表达式:
形式: 表达式1,表达式2,表达式3,.......,表达式n;
求解规则:从左往右求解,结果为最后一个表达式的值。
代码示例:
#include <stdio.h>
#include <stdlib.h>
/*这个程序用来测试逗号运算符的作用机制*/
int main()
{
/*例一*/
int a1,b1;
b1=(a1=3*5,a1*4);
printf("a1=%d\tb1=%d\n",a1,b1);
/*例二*/
int a2,b2,x1;
b2=(x1=(a2=3*5,a2*4),a2+5);
printf("a2=%d\tb2=%d\tx1=%d\n",a2,b2,x1);
/*例三*/
int a3,b3;
b3=(a3=3,6*3);
printf("a3=%d\tb3=%d\n",a3,b3);
/*例三*/
int a4,b4,x2;
b4=(x2=a4=3,6*a4);
printf("a4=%d\tb4=%d\tx2=%d\n",a4,b4,x2);
return 0;
}
结果:
解析:
例一中:逗号运算符分隔开了:a1=3*5和a*4这两个表达式。根据逗号表达式由左到右的运算规则,先运算a1=3*5;得到a1=15,表达式的值为15。接着运算a1*4,得到表达式的值为60,根据逗号表达式的值为最右表达式的值的原则。得到(a1=3*5,a1*4)的值为最右边的表达式即a1*4的值60。所以b1的值为60。和输出结果相符。
#include <stdio.h>
#include <stdlib.h>
/*
这个程序用于输出两个输入数中较大的一个
*/
int main()
{
int a,b,t;
scanf("%d %d",&a,&b);
if(a<b)
{
t=a;
a=b;
b=t;
}
printf("较大的值为:%d",a);
return 0;
}
使用逗号表达式之后,可以改为:
#include <stdio.h>
#include <stdlib.h>
/*
这个程序用于输出两个输入数中较大的一个
*/
int main()
{
int a,b,t;
scanf("%d %d",&a,&b);
if(a<b)
{
t=a,a=b,b=t;
}
printf("较大的值为:%d",a);
return 0;
}
将几个表达式写入一个语句,提高代码效率。