C语言学习笔记(重温要点四)

四. 操作数、运算符及其表达式

1.表达式书写规则:
运算符不能相邻。特殊的是:±号相邻有时表示正负时可以相邻。
乘号“*”不能省略。
乘除法优先级高于加减法,优先级的改变可以通过括号改变。括号必须成对出现。
2.算数表达式:数学中不区分参与运算的对象是整数还是实数,最终的计算结果就是数学上的真实的值;C语言中,要区分参与运算的对象的数据类型。例如:5/3和5/3.0。
3.求余“%”操作不可以包括double和float类型。求余x%y等价于x-(x/y)*y。
求余数的一个作用就是求个位数。例:45%10=5
4.高级赋值:

num1+=num2;等价于num1=num1+num2;
num1-=num2;等价于num1=num1-num2;
num1*=num2;等价于num1=num1*num2;
num1/=num2;等价于num1=num1/num2;
num1%=num2;等价于num1=num1%num2;

5.自增自减运算符
x++;表示先引用再自增;y–;表示先引用再自减
++x;表示先自增再引用; --y;表示先自减再引用
注:++, --不能用于常量或表达式
6.表达式规则:自右向左结合;赋值语句左侧必须是变量,不能是常量或表达式;使赋值号右边表达式值自动转换成其左边变量的类型;赋值表达式的值与变量值相等,且可嵌套。

7.逗号表达式
多个表达式的值用逗号连在一起就是逗号表达式,按照顺序求值,每个表达式都会被执行计算出结果,值为最后一个表达式的值。
逗号运算符优先级最低,也就是任何运算符的优先级都要高于逗号。
用于计算求值的时候,起到顺序求值运算符的作用
不用于计算的时候起到间隔符的作用,让语句连在一起
多个逗号运算符的方向是从左到右
int i=(1,3,4+5);//值为9
printf(“h”),printf(“e”),printf(“l”),printf(“l”),printf(“o”),getchar();//可以打印出hello

8.关系运算符

//大于
<//小于
=//大于等于
<=//小于等于
==//等于
!=//不等于
关系表达式成立值为1,否则为0。

Printf(%d”,1<2<3<4);//打印的结果为1,1<2<3<4等价于((1<2)<3)<4=(1<3)<4=1<4
Printf(%d”,4>3>2>1);//打印的结果为0,4>3>2>1等价于((4>3)>2)>1=(1>2)>1=0>1

9.字符串的比较:
字符串之间>,<,>=,<=都没有意义,只有相等和不等才有意义。注:等号和不等号一般不用于比较两个字符串,比较的是两个字符串在内存中地址的大小;变量是独立开辟内存,互相不影响;常量,相等的数值或者字符串都只有一个引用,为了节约内存,常量不会改变,多次引用不会出现问题,因为常量相等则编译器分配的地址也相同。
10.逻辑运算符
与&&
或||
非!
注:短路表达式前面表达式符合条件不需计算逻辑运算符后的表达式。
11.条件运算符
A?B:C;//A成立执行B,否则执行C。
结合方向自右向左
条件运算符的优先级高于赋值运算符
三目运算符会自动进行数据类型转换

运算符的优先级:!>算数运算符>关系运算符>&&>||>赋值运算符
来自传智播客视频
12.左值与程序实体
程序实体是内存中的一块可标识的区域;
左值是左值表达式的简称,是指明一个程序实体的表达式。
判断一个表达式是否是左值的方法是看其能否放在等号的左边。能放在赋值号左边的表达式都是左值,它指明了一块内存区域,而赋值运算实质是改变这一区域内容的操作。
但应注意,能放在赋值号左边的表达式都是左值,但左值并非一定可以放在赋值号左边,const常量是左值,但不能将其放在赋值号左边,这是个例外。
a+1,5,3等这样的表达式没有程序实体,不在内存里面,而在CPU的寄存器里面;
如“float a;”声明了一个浮点型变量a,则a是左值,因为它指明了一个程序实体,在内存中找得到,可放在赋值号的左边。但是表达式“a+3”,“a-2”“a=1”等就不能放在赋值号的左边,他们在内存里面,C语言不能赋值给CPU的寄存器,没有意义。特殊地,C语言中嵌入汇编即可解决。
13.C语言插入汇编语言,显示出了C语言的强大功能,可以直接操作硬件,从事嵌入式开发或逆向软件开发的需了解。

int x = 10;
_asm
{
	mov eax, 20
	add eax, -15
	mov x, eax
}
printf("%d\n", x);

来自传智播客视频

int a;
printf("%d\n", 2 * -3);//结果为-6,运算符和操作数相邻优先级才有效。
printf("%d\n", (a = (a = 3, 6 * 3)));//a=18,值为18
printf("%d\n", (a = a = 3, 6 * 3));//a=3,值为18

(a = 3 * 5, a * 4), a + 5;//a=15,值为20
printf("%d,%d\n", a, ((a = 3 * 5, a * 4), a + 5));//a=15,值为20
printf("%d\n", a = 3 * 5, a * 4);//15
printf("%d\n", ((a = 3 * 5, a * 4), a + 5));//20

a = 3, a += 2, a + 3;
printf("%d,%d\n", a, (a = 3, a += 2, a + 3));//a=5,值为8
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值