C语言运算符和表达式-笔记(四)

一、运算符

1、分类

(1)根据操作数的数量:一元运算符、二元运算符和三元运算符
(2)根据操作数的用途:赋值运算符、算术运算符、关系运算符、逻辑运算符、位运算符……

2、运算符的优先级和结合方向

(1)按运算符的优先级高低次序执行。例如,先乘除后加减。
(2)如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按C语言规定的结合方向(结合性)进行。结合性是指该操作数是先与左边的运算符结合,还是先与右边的运算符结合。
(3)用法
指针最优,单目运算优于双目运算,如正负号。
先乘除取余,后加减。
先算术运算,后移位运算,最后位运算。
特别注意:1<<3+2 & 7等价于(1<<(3+2))&7

3、运算符类型表:在这里插入图片描述

(1)(类型) —类型转换
将强制类型转换放在一个表达式前面只会改变表达式的第一个项目的类型。如果要对整个表达式的结果进行强制类型转换,则必须把整个表达式用括号括起来。

用法:
float x,f;
f=3.14159;
x=(int)f;
printf("f=%.4f\n",f);//输出:f=3.1416
printf("x=%.2f\n",x);//输出:x=3.00

运算符数据类型转换(由低到高)
char->short->int(long)->unsigned int->float->double(long double)
double不能直接转换为int,只能先转为float,否则精度丢失。

(2)逻辑运算
逻辑与(&&)、逻辑或(||)、逻辑非(!)
A && B:只有当A和B的值都为真(非零)时,表达式的值才为真。短路运算
时,如果A的值为假,则B不处理。
A || B:只有当A和B的值都为假(零)时,表达式的值才为假。短路运算
时,如果A的值为真,则B不处理。
! A:当A的值为真时,表达式的值为假,当A为假时,表达式的值为真。

用法:
if(a==1)相当于if(1==a)
if(a>3&&a<5)
if(a>3||a<5)

(3)位操作
左移位:值最左边的几位被丢弃,右边多出来的几个空位则由0补齐
如:清零:1011 0101 第八位清零
则:1<<7;[(1<<7)取反]->0111 1111;1011 0101与0111 1111相与->0011 0101
如:清零:0101 1101 第三、四、五位清零
则:111(7)<<2;[111(7)<<2取反]->1110 0011;0101 1101相与1110 0011->0100 0001

& 跟0与清0,跟1与不变 (与)
| 跟0或不变,跟1或置1 (或)
^ 跟0异或不变,跟1异或取反 (异或)
与(0)清0,或(1)置位,异或(1)取反。

(4)算术运算符
除%操作符,其余操作符既可用于浮点型也可用于整数类型。
当/操作符的两个操作数都是整数时,执行整除运算,其他情况执行浮点数除法。
①取余运算–符号位由被除数(第一个)决定,且被除数只能是整数

printf("%d\n",5%3);//输出:2
printf("%d\n",5%-3);//输出:2
printf("%d\n",-5%3);//输出:-2
printf("%d\n",-5%-3);//输出:-2

②++和–运算符

int num=3;
printf("%d\n",num++);//表达式:3  ++后置,先用后运算 num:4
printf("%d\n",++num);//表达式:5  ++前置,先运算后用 num:5
printf("%d\n",--num);//表达式:4  --前置,先运算后用 num:4
printf("%d\n",num--);//表达式:4  --后置,先用后运算 num:3
不能用于常量:
10++; // error
--10; // error

③整数相除取整

printf("%d\n",22/5);//输出:4
整数相除若要保证精度,则除数需要保留一位小数,如下:
int sum=22;
float average;
average=sum/5;
printf("%f\n",average);//输出:4.000000
average=sum/5.0;
printf("%f\n",average);//输出:4.400000

/和%不能对整数0进行操作,否则会中断程序。但是可以对浮点0进行操作,但是得到的结果是inf,表示无穷大。%不能对浮点数使用。/向零取整(取更接近0的数字)。%的结果与其左操作数的符号一致。

(5)sizeof—计算数据类型所占字节数(长度运算符)
功能:用于判断其操作数的类型长度,以字节为单位,操作数既可以为表达式,也可为单个变量,亦可是两边加上括号的类型名。
如:

sizeof(int)  //返回整型变量的字节数 
sizeof x   //返回变量x所占据的字节数,定义上字符变量的长度为1个字节,当sizeof的操作数为数组名时,返回该数组的长度,以字节为单位,在表达式的操作数两边加上括号也是合法的,如sizeof(x) 

判断表达式的长度并不需要对表达式进行求值,所以sizeof(a=b+1)并没有向a赋任何值。

(6)关系操作符
关系操作符产生的结果都是一个整型值:1或者0,而不是布尔值,如果两端的操作数符合操作符指定的关系,表达式得结果是1,若不符合,表达式的结果是0,关系操作符的结果为整型值,故可以赋值给整型变量。
测试语句”不等于0”可用关系操作符实现,也可通过测试表达式的值来完成,如下:

if(expression !=0)…相当于if(expression)…
测试语句”不等于0”如下:
if(expression ==0)…相当于if(!expression)

(7)条件运算符 表达式1 ? 表达式2 :表达式3
条件操作符?:接受3个参数,如果第一个操作数值为真,则表达式值为第二个操作数的值,否则为第三个操作数的值。

#include <stdio.h>

int main()
{ 
	int a=3,b=30,c=9;
    a<5?(c=6):b>20?(b=8):(c=9);
    printf("a=%d\nb=%d\nc=%d\n",a,b,c);
    return 0;
}
运行输出:a=3  b=30  c=6
//a<5-->c=6,后面的式子不再计算
#include <stdio.h>

int main()
{
	int a=6,b=30,c=9;
    a<5?(c=6):b>20?(b=8):(c=9);
    printf("a=%d\nb=%d\nc=%d\n",a,b,c);
    return 0;
}
运行输出:a=6  b=8   c=9
//a<5->式子等于b>20?(b=8):(c=9);

(8)赋值运算符
单个=号用于赋值操作,双==号表示比较运算。

int a,b,c;
a=b=c=10;int a=10,b=11,c=12; 赋值表达式的值就是赋值表达式左操作数的值。
赋值运算符还可和其它运算符结合起来使用,构成复合赋值。
a += b; // a = a + b
a %= b; // a = a % b
初始化与赋值是不同的:
int a = 10; // 初始化 //int a;
a = 100; // 赋值

(9)逗号操作符把两个或更多个表达式连接在一起,从左到右依次进行求值,整个表达式的值就是最右边那个表达式的值。如:
逗号表达式:表达式1,表达式2 ,…,表达式n
其求值过程是分别求表达式1、表达式2…表达式n的值,并把最后一个表达式n的值作为整个逗号表达式的值。

运算符优先级和结合性(重点):
指针最优,单目运算优于双目运算,如正负号。
先乘除取余,后加减。
先算术运算,后移位运算,最后位运算。
特别注意:1<<3+2 & 7等价于(1<<(3+2))&7

二、表达式

1、概念

(1)用运算符和括号将操作数连接起来的、符合C语言语法规则的式子,称为表达式。
(2)说明:
运算符和操作数的有效组合;
操作数可以是变量、常量或者函数;
在程序执行的过程中,变量的实际值和表达式中出现的常量一起使用;
(3)分类: 算术表达式;关系表达式;逻辑表达式;函数表达式。

2、运算符和表达式应用

(1)、输入一个double类型数据,然后输入一个整数代表需要保留的小数位数,通过计算对输入的小数保留N位小数(四舍五入),并把结果输出。

程序:
#include <stdio.h>
#include <math.h>

int main()
{
	int b,n;//n为需要保留的小数位数
	double y,f;//f为输入的浮点数
	double a,c;
	printf("请输入浮点数:\n");
	scanf("%lf",&f);//输入f (该题所解决部分,输入精度需为lf)
	printf("请输入需要保留的小数位数:\n");
	scanf("%d",&n);//输入n
	y=pow(10,n); //y为10的n次方(10^n表达)
	a=f*y+0.5;   //a为浮点数乘以10的n次方+0.5
	b=(int)a;    //对a取整
	c=b/y;      //c为b除以10的n次方
	printf("c=%.*f\n",n,c); //输出四舍五入之后的值
	return 0;
}

(2) 输入五门学科的成绩(整数),计算出总分和平均分,平均保留一位小数,输出结果。

程序:
#include <stdio.h>
int main()
{
	int a,b,c,d,e,sum;//n为需要保留的小数位数
	double average;//定义变量average为平均分
	printf("请输入各科成绩:\n");
	scanf("%d,%d,%d,%d,%d",&a,&b,&c,&d,&e);//输入各科成绩
	sum=a+b+c+d+e;//求总分
	average=sum/5.0;//求平均分(该题所解决问题部分,精度)
	printf("总分:%d,平均分:%.1f\n",sum,average);
	return 0;
}

(3)给定一个变量year,判断这个年份是否闰年?用三目运算符写出这个表达式?
闰年判别规则:
①普通年份如2018,是4的倍数但不是100的倍数,换言之对4取余一定为0,对100取余不为0。
②世纪年份如2000,2100,必须是400的倍数,换言之对400取余一定为0;
世纪年份不仅要对4和100整除为0,同时也对400整除为0。

程序:
#include <stdio.h>

int main()
{
	
	int b,year;
	printf("请输入年份:");
	scanf("%d",&year);
	b=(((year%4)==0 ? year%100:1)==0 ? year%400 :year%4)==0 ?2:1;
	if(b==1)
	{
		printf("%d是非闰年\n",year);
	}
	else if(b==2)
	{
		printf("%d年是闰年\n",year);
	}
	return 0;
}
b=(((year%4)==0 ? year%100:1)==0 ? year%400 :year%4)==0 ?2:1;
//此处逻辑嵌套,虽然是由右往左运算,但最右边?左边未知,需要先求解,所以最终还是从左往右运算。
//闰年只有2种情况:①除以4为0,再除以100不为0 
//                  ②除以4为0,再除以100为0,再除以400还为0
//此处在于使用year%4解决区别对待1和year%100都不为0的情况。
另外一种方式:
//判断闰年:能被4整除且不能被100整除,或能被400整除的年份
if((i%4==0 && i%100 !=0)||i%400==0)
{
	printf("%d ",i);
}

编辑 2020-04-20 21:55 首次编辑
增改 2020-10-11 11:12 增加运算符和表达式应用部分
增改 2021-07-02 23:56 修改内容结构

注:本文旨于作为自己的学习笔记,不作他用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值