云边日落 千古兴亡多少事,悠悠。不尽长江滚滚流。 (宋·辛弃疾·南乡子)
博主 云边日落
渝ICP备2021002886号-1渝公网安备50022502000591号博主 11月5日 在线自豪地使用 Typecho 建站搭配使用 🌻Sunny 主题当前在线 1 人
歌曲封面 未知作品
  • 歌曲封面“魔女の宅急便”~ルージュの伝言松任谷由実

渝ICP备2021002886号-1

渝公网安备50022502000591号

网站已运行 4 年 152 天 19 小时 56 分

Powered by Typecho & Sunny

2 online · 41 ms

Title

认识数据类型和表达式(三)

郭儿宝贝

·

·

179次阅读
编辑语言
Article
⚠️ 本文最后更新于2021年07月13日,已经过了1227天没有更新,若内容或图片失效,请留言反馈

大家好,今天我们来看看数据类型和表达式的最后一部分。

赋值表达式

赋值运算符 =

同样,先来看看赋值运算符 = 。它的左边必须是一个变量,作用是把一个表达式的值赋给一个变量。

重要的事说三遍:

赋值运算符是将表达式的值赋给一个变量!是表达式的值!
赋值运算符是将表达式的值赋给一个变量!是表达式的值!
赋值运算符是将表达式的值赋给一个变量!是表达式的值!

它的优先级低于算术运算符,如: x=(3*4) 等价于 x=3*4
它的结合性是从右向左,如: x=y=3等价于 x=(y=3)

赋值表达式 变量=表达式

即将一个变量和一个表达式连接起来的式子。

赋值表达式的运算过程与一般数学等式并不相同:

如计算赋值表达式n的值:

♾️ c 代码:
int n;
n = 3.14 * 2;
  • 它先计算 = 右侧表达式的值: 3.14 * 2 =6.28
  • 再将= 右侧的表达式的值赋给= 左侧的变量(此时,右侧的数据类型会自动转换成左侧的数据类型): 6.28转换为整型值6赋给n
  • 最后将= 左侧的变量的值作为赋值表达式的值。 该赋值表达式的值是6,类型是整型

=右侧的表达式也可以是赋值表达式,计算方法同上。

如:x=(y=3) :先计算表达式y=3,再将3赋给x,结果使得x和y都得3.

复合赋值运算符

赋值运算符分为简单赋值运算符和复合赋值运算符。
简单赋值运算符即前面所讲的 由一个变量和一个表达式组成的。
复合赋值运算符便是在 =前面加上算数运算符,如下表1,它的一般形式是: 变量 赋值运算符 表达式

运算符名称等价关系
+=加赋值x+=exp 等价于 x=x+(exp)
-=减赋值x-=exp 等价于 x=x-(exp)
*=乘赋值 x*=exp 等价于x= x*(exp)
/=除赋值x/=exp 等价于 x=x/(exp)
%=取余赋值 x%=exp 等价于 x=x%(exp)
x*=y-3 等价于 x=x*(y-3)

关系表达式

关系运算符

和数学符号不同,C中大于或等于是 >=, 小于或等于是 <= ,和 < >优先级较高;C中等于是 == ,不等于是 !=,优先级较低。
如:

♾️ c 代码:
int a,b,c;
char ch;
a>b==c;       //等价于(a>b)==c
ch>'a'+1;     //等价于ch>('a'+1)
b-1==a!=c;    //等价于((b-1)==a)!=c;

关系表达式

即用关系运算符将两个表达式连接起来的式子。关系表达式的值是一个逻辑量,取值真或假,也可以用1或0表示。如:

♾️ c 代码:
#include <stdio.h>
int main()
{
    char ch='w';
    int a=2,b=3,c=1,d,x=10;
    
    printf("%d",a>b==c);
    printf("%d",d=a>b);
    printf("%d",ch>'a'+1);
    printf("%d",d=a+b>c);
    printf("%d",b-1==a!c);
    printf("%d",3<=x<=5);   // <=是左结合,计算机会先计算x<=3,结论无论是真是假,都会小于5,所以这里最好写成((3<=x)&&(x<=5)),(&&是逻辑运算符,见下文)
    
    return 0;

}

输出结果是: 0 0 1 1 0 1

逻辑表达式

逻辑运算符

逻辑运算对象可以是关系表达式也可以是逻辑量,运算结果也是一个逻辑量,可以用1或0表示真或假,见下表:

目数单目双目
运算符!&&(两根竖线)
名称逻辑非逻辑与逻辑或

(由于写者输入法问题,这里特别标注一下逻辑或: ||

逻辑运算符的基本运算类似数学运算,如:
若a为真,b为假,则:
!a是0,a&&b是0,a||b是1.

如果某个逻辑量的值为非0,则这个逻辑量为真;反之为假。

如: a=10,则a的逻辑量便为1; b=0,b的逻辑量便为0.
其中 &&的优先级高于 ||,结合性是从左向右,具体的优先级见认识数据类型和表达式(二)中的图片。如:

  • a||b&&c等价于 a||(b&&c)
  • !a&&b等价于 (!a)&&b;
  • a||3+10&&2 等价于 a||((3+10)&&2) .

    虽然系统有自定义的优先级,但是我们在写程序的时候,尽量用括号标明优先级。

    逻辑表达式

    即用逻辑运算符将关系表达式或逻辑量连接起来的式子。逻辑运算对象是值为真或假的逻辑量,它可以是任何类型的数据,如整型、实型、字符型等,系统在给出逻辑运算结果时用1代表真,0代表假。
    运算实例:

    ♾️ c 代码:
    #include <stdio.h>
    int main()
    {
     char ch='w';
     int a=0,b=0,c=0;
     float x=3.0;
     
     printf("%d",a&&b);
     printf("%d",a||b&&c);
     printf("%d",!a&&b);
     printf("%d",a||3+10&&2);
     printf("%d",!(x==2));
     printf("%d",!x==2);   //!优先级高于==,先计算!x
     printf("%d",ch||b);
    
     return 0;
    
    }

    运行结果: 0 1 0 1 1 0 1

与其他表达式的运算过程不同,求解用逻辑运算符 && 或者 || 连接的逻辑表达式时,按从左到右的顺序计算该运算符两侧的操作数,一旦能得到表达式的结果,就停止计算。

如: a&&b 当a的值为0时,则a&&b的值一定是0.此时便没有必要再计算b的值。

逗号表达式

c语言中,逗号既可作分隔符,又可作运算符。

  • 作为分隔符使用时,用于间隔说明语句中的变量或函数中的参数,如: int a, b, c;
  • 作为运算符使用时,将若干个独立的表达式连接在一起, 组成逗号表达式。逗号表达式的一般形式是: 表达式1,表达式2,......表达式n;
运算过程是:先计算表达式1的值,然后计算表达式2的值,最后计算表达式n的值,并将 表达式n的值 作为逗号表达式的值,将表达式n的类型作为逗号表达式的类型。

逗号运算符的优先级是所有运算符中最低的,它的结合性是从左到右。如, (a=2),(b=3),(c=a+b) 等价于 a=2, b=3, c=a+b

位运算

位运算是C语言与其他高级语言相比较,一个比较有特色的地方。
位运算是指进行二进制位的运算,一位一位的运算。具体如下表:
以x=84,二进制换算为 0101 0100 ,y=59,二进制换算为 0011 1011 为例。

运算符名称例子结果
&按位"与"x&y0001 0000
(一根竖线)按位"或"x(一根竖线)y0111 1111
^按位"异或"x^y0110 1111
~取反(单目)~x1010 1011
<<左移y<<21110 1100
>>右移0011 1010>>20001 1101

(一根竖线)即 | .

各运算符的用法:
♾️ c 代码:
/*以0100和1011为例*/
    0100
    1011
&)  0000  //两个数的第一位按位“与”:0&1=0,以此类推,两个数的每一位按位“与”,得到结果
|)  1111  //两个数的第一位按位“或”:0|1=0,以此类推,两个数的每一位按位“或”,得到结果
^)  1111  //两个数的第一位按位“异或”(两个第一位不同为1,如0^1=1,0^0=0):0^1=0,以此类推,两个数的每一位按位“或”,得到结果


~0100  //每一位取反码,得到1011
  • 位运算所操作的操作数只能是整型或者字符型以及它们的变体。
  • 位运算中除了~是单目,其它都是双目运算符。
  • 操作数的移位运算不改变原操作数的值。

    特殊运算:
  • a^a=0;
  • a^~a=二进制全1;
  • ~(a^~a)=0.
  • 使用位“异或”不需要临时变量就可以交换两个变量的值:
    a^=b^=a^=b,即:

    ♾️ c 代码:
    b^=a^=b;
    a=a^b;

移位运算

移位运算是指对操作数以二进制位为单位进行左移或右移的操作,有 >>(右移)<<(左移) 两种。

a>>b 表示将a的二进制值右移b位, a<<b 表示将a的二进制值左移b位。
要求:a和b都是整型,b只能为正数,且不能超过机器字所表示的二进制位数。
移位运算具体实现有三种方式:

  1. 循环移位:在循环移位中,移入的位等于移出的位。
  2. 逻辑移位:在逻辑移位中,移出的位丢失,移入的位取0。
  3. 算术移位:在算术移位(带符号)中,移出的位丢失,左移入的位取0,右移入的位取符号位,即最高位代表数据符号,保持不变。
    其中:
  4. C语言中的移位运算方式与具体的C语言编译器有关。
  5. 通常实现中,左移位运算后右端出现的空位补0,移至左端之外的位则舍弃;右移运算与操作数的数据类型是否带有符号位有关,不带符号位的操作数右移位时,左端出现的空位补0,移至右端之外的位则舍弃,带符号位的操作数右移位时,左端出现的空位按符号位复制,其余的空位补0,移至右端之外的位则舍弃。
  6. 在数据可表达的范围里,一般左移1位相当于乘2,左移2位相当于乘4,右移则除。

例如:

♾️ c 代码:
a=58=00 11 1010;
//a<<2(左移两位):
11 1010 00=232=58*4;
//a>>1(右移两位):
0 0001 101=29=58/2;

复合位赋值运算符就是在=前加上位运算符

长度运算符

长度运算符 sizeof 是一个单目运算符,用来返回量或数据类型的字节长度。
如: sizeof(int)=4,即返回数据类型int的字节长度为4.

好啦,今天份学习到此结束啦!同学们也要继续加油哦,晚安!

现在已有 0 条评论,0 人点赞
Author:郭儿宝贝
作者
认识数据类型和表达式(三)
当前文章累计共 4874 字,阅读大概需要 6 分钟。
分支结构
2021年7月13日 · 0评论
循环结构
2021年7月17日 · 0评论
数组
2021年8月17日 · 0评论
Comment:共0条
发表
搜 索 消 息 足 迹
你还不曾留言过..
你还不曾留下足迹..
博主 不再显示
博主