大家好,今天我们来看看数据类型和表达式的最后一部分。
赋值表达式
赋值运算符 =
同样,先来看看赋值运算符 =
。它的左边必须是一个变量,作用是把一个表达式的值赋给一个变量。
重要的事说三遍:
赋值运算符是将表达式的值赋给一个变量!是表达式的值!
赋值运算符是将表达式的值赋给一个变量!是表达式的值!
赋值运算符是将表达式的值赋给一个变量!是表达式的值!
它的优先级低于算术运算符,如: 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中等于是 ==
,不等于是 !=
,优先级较低。
如:
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&y | 0001 0000 |
(一根竖线) | 按位"或" | x(一根竖线)y | 0111 1111 |
^ | 按位"异或" | x^y | 0110 1111 |
~ | 取反(单目) | ~x | 1010 1011 |
<< | 左移 | y<<2 | 1110 1100 |
>> | 右移 | 0011 1010>>2 | 0001 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.
使用位“异或”不需要临时变量就可以交换两个变量的值:
♾️ c 代码:
a^=b^=a^=b
,即:b^=a^=b; a=a^b;
移位运算
移位运算是指对操作数以二进制位为单位进行左移或右移的操作,有 >>(右移)
和 <<(左移)
两种。
a>>b
表示将a的二进制值右移b位, a<<b
表示将a的二进制值左移b位。
要求:a和b都是整型,b只能为正数,且不能超过机器字所表示的二进制位数。
移位运算具体实现有三种方式:
- 循环移位:在循环移位中,移入的位等于移出的位。
- 逻辑移位:在逻辑移位中,移出的位丢失,移入的位取0。
- 算术移位:在算术移位(带符号)中,移出的位丢失,左移入的位取0,右移入的位取符号位,即最高位代表数据符号,保持不变。
其中: - C语言中的移位运算方式与具体的C语言编译器有关。
- 通常实现中,左移位运算后右端出现的空位补0,移至左端之外的位则舍弃;右移运算与操作数的数据类型是否带有符号位有关,不带符号位的操作数右移位时,左端出现的空位补0,移至右端之外的位则舍弃,带符号位的操作数右移位时,左端出现的空位按符号位复制,其余的空位补0,移至右端之外的位则舍弃。
- 在数据可表达的范围里,一般左移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.
好啦,今天份学习到此结束啦!同学们也要继续加油哦,晚安!