学习笔记---赋值运算符与逗号运算符

41 篇文章 0 订阅
26 篇文章 0 订阅

赋值运算符和赋值表达式:

赋值运算符
优先级运算符功能结合方式
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;
}
将几个表达式写入一个语句,提高代码效率。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值