三、运算符与表达式
C语言一共有34个运算符,记这些运算符时从以下几个方面记:
运算符的书写形式;
运算符的运算规则;(两个整数相除,结果为整数)
所能进行的操作数;(取余运算符%,操作数只能是整数)
优先级和结合性;
a+b*c //要考虑优先级问题
考点一 算术运算符
- 两个整数相除的结果为整数。
5/3=1,1.0/2.0=0.5 //整数除法为整数 小数除法为小数 - %要求参加运算的运算对象为整数,结果也是整数。
8%3,结果为2
-8%3,结果为-2
被除数是正结果为正,被除数为负,结果为负 - *不能省略
- 理解和掌握%10为截取个位
/10为截掉个位
分解整数用的比较多
考点二 赋值运算符与表达式(3钟)
- 赋值运算符: = ,优先级倒数第二(逗号倒一)
- 赋值运算符左侧必须为变量,不能为常量或表达式,区别于数学式;
- 右结合;
int x,y,z;//定义
x= y=z=3;//赋值
int x=y=z=3; X //定义要逐个定义逐个赋值
带数据类型的叫做定义
不带数据类型的叫做 使用
4、区分赋值运算和逗号运算:x=3,y=5; x=(3,y=50);
5、复合赋值运算符:y+=y*=3+6;等价于y = y* (3+6);
++(--)只能是变量,不能是常量,表达式 可以是混合运算
2019 .已知int y=10:则执行y+=y-=y-y;后y的值是()
A.10 B.20 C.30 D.40
#include <stdio.h>
void main()
{
int a = 10;
a +=a -= a-a;
printf("a = %d", a);
}
2018. 设有语句 int a=3; 则执行了 a*=a+=a-2; 后为()
A.3 B.4 C.16 D.9
#include <stdio.h>
void main()
{
int a = 3;
a *=a += a-2;
printf("a = %d", a);
}
考点三 关系与逻辑运算符等价形式
- > < >= <= == !=
- 优先级:< <= > >= —— == !=
算术运算符 → 关系运算符赋值→ 赋值 - 关系表达式的值为一个逻辑值,即“真”用“1”表示或“假”用“0”表示。
int x=4,y; y=2<x<6;则y值?
#include <stdio.h>
void main()
{
int x=4,y;
y=2<x<6;
printf("%d",y);
}
- ! && ||
- 优先级:!→&&→||
! 算术运算符 关系运算符 && || 赋值 - 知识点
运算时:所有非0值(包括负数)均“真”,0表示“假”
结果:真为1,假为0
2)若变量c为char型,能正确判断c为大写字母的表达式写法:
#include <stdio.h>
void main()
{
char c;
scanf("%c",&c);
if (c >= 'A' && c <= 'Z') {
printf("你输入的是大写字母");
}else{
printf("你输入的是小写字母");
}
}
判断c为小写的程序段
#include <stdio.h>
void main()
{
char c;
scanf("%c",&c);
if ((c >= 'a') && (c <= 'z')) {
printf("你输入的是小写字母");
}else{
printf("你输入的不是小写字母");
}
}
2019.以下关于逻辑运算符两侧运算对象的叙述正确的是( )
A.只能是整数0或1
B.只能是整数0或非0
C.只能是整数0或正整数
D.可以是任意合法表达式
2019 .若有int x=1,y=2,z;则表达式z=(x==y)的值是
A.0 B.1 C.true D.flase
#include <stdio.h>
void main()
{
int x=1,y=2;
int z=(x==y);
printf("%d",z);
}
考点四 短路规则
- a&&b :有假则假,全真才真。
求解——如a为真,才判断b的值;如a为假则不再判断b; - allb:有真则真,全假才假。
求解——如a为假,才判断b的值;如a为真则不再判断b; - 注意:优先级在短路规则中失效!
若a=3,b=1;执行a++1l--b后,a,b的值?
#include <stdio.h>
void main()
{
int a=3,b=1;
if(a++||--b){
printf("%d%d",a,b);
}
}
例:a = 2; b = 3; c = 4a>1|| b++ >2 ||c--!=0
#include <stdio.h>
void main()
{
int a=2, b=3,c=4;
if(a>1||b++>2||c--!=0){ //遇真则真 全假才假 a>1 成立为1 不继续往下执行
printf("a=%d \nb=%d\nc=%d",a,b,c);
}
}
例: a=1,b=2,c=3,d=4,m=1,n=1(m=a>b)&&(n=c>d) m=?,n=?
已知整型变量m,n,a,b,c,d的值都是0,则执行(m=a==b) || (n=c==d);后m与n的值分别为()。
#include <stdio.h>
void main()
{
int m=0, n=0,a=0,b=0,c=0,d=0;
if((m=a==b)||(n=c==d)){
printf("m=%d \nn=%d",m,n);
}
}
已知w=1,x=2,y=3,z=4,a=5,b=6;则执行语句(a=w>x)&&(b=y>z)后, a,b的值为( )。
#include <stdio.h>
void main()
{
int w=1,x=2,y=3,z=4,a=5,b=6;
if((a=w>x)&&(b=y==z)){
printf("a=%d \nb=%d",a,b);
}
}
考点五 条件运算符
- 表达式1? 表达式2:表达式3
- 优先级比赋值运算符,逗号运算符高
- 右结合
- a> b?a:c> d?c:d
- 正确区分表达式1、2、3
+x=y+2?y++:y-=3;
b?a:c>d?c:d
+a>b? (max=a):(max=b);
若x=1,y=2;则表达式x++>=y?1:2的值为( )。
#include <stdio.h>
void main()
{
int x=1,y=2;
if(x++>=y?1:2){
printf("x=%d \ny=%d",x,y);
}
}
2018,已知a=1,b=2,c=3,d=4,x=5,则语句x=(a>b?a:c<d?c:d);执行后x的值为()。
#include <stdio.h>
void main()
{
int a=1,b=2,c=3,d=4,x=5;
if(x=(a>b?a:c<d?c:d)){
printf("x=%d",x);
}
}
考点六 逗号运算符
- 表达式1,表达式2,....,表达式n.
- 求解过程为:先求解表达式1,再求解表达式2,后求解表达式n。
- 逗号表达式的值是最后一个表达式的值.
- 优先级最低,具有左结合性。
考点七 位运算
- &(按位与) |(按位或) ^(按位异或) :相同为0,不同为1
~ (按位取反)<<(左移位)>>(右移位) - 只能是整型数据或字符型数据,不能是实型数据;
- 对字节或字内的二进制位进行的操作;
- 运算对象一律按二进制补码参加运算,并按位进行运算;
转换成二进制补码,进行位运算,根据要求转换进指数