C语言得操作符

1.算术操作符

+,-,*,/,%

①除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。

②对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法

③%操作符的两个操作数必须是整数。返回的是整除之后的余数。

2.移位操作符

整数的2进制表示形式,其实有3种
原码
反码
补码
内存中存储的起始是:补码的二进制
所以在参与移位的时候,移动后都是补码

 按照一个数的正负,直接写出它的二进制表示形式得到的就是原码
    正数
    正数的原码、反码、补码是相同的
    负数的原码、反码、补码要经过计算的
    反码是原码的符号位不变,其他位按位取反,就是反码
    补码是反码+1
     int a = 10;
    整型占4个字节(32bit)
    00000000000000000000000000001010 - 原码
    00000000000000000000000000001010 - 反码
    00000000000000000000000000001010 - 补码

2.1左移操作符(<<)

移位规则:左边抛弃,右边补0.

例如:int num=10;

num在内存中的二进制:00000000000000000000000000001010 

num左移一位的结果:00000000000000000000000000010100红色这个0就是因为左移了一位后补上去的。

2.2右移操作符(>>)

右移操作符移位运算有两种:

①逻辑移位:左边用0填充,右边丢弃。

②算数移位:左边用原该值的符号位填充,右边丢弃

例:int num=-1;

num在内存中的二进制:11111111111111111111111111111111

逻辑右移结果:01111111111111111111111111111111

算术右移结果:11111111111111111111111111111111//由于是负数所以符号位为1,所以左变就补充1.

ps:对于移位运算符,不要移动负数位,这个是标准未定义的。

例如:int num=10;num>>-1;这种表达方式是错误的。

3.位操作符

&//按位与;        对应的二进制位有0则为0,两个同时为1才为1;

|//按位或;          对应的二进制位有1则为1, 两个同时为0才为0;

^//按位异或;       对应的二进制位:相同为0,相异为1;

ps:他们的操作数必须是整数。

4.赋值操作符

=是最常用的赋值操作符。例int a=0;int x=10;

复合赋值符

+=        a+=10相当于a=a+10;

-=        a-=10相当于a=a-10;以此类推下面符合操作符也是一样的

*=

/=

%=

>>=

<<=

&=

|=

^=

5.单目操作符

5.1单目操作符

!        逻辑反操作

-           负值

+          正值

&          取地址

sizeof   操作数的类型长度(以字节为单位)

~          对一个数的二进制按位取反

--        前置、后置--

++       前置、后置++

*          间接访问操作符(解引用操作符)

(类型) 强制类型转换

#include <stdio.h>
int main()
{
 int a = -10;
 int *p = NULL;
 printf("%d\n", !2);//0
 printf("%d\n", !0);//1
 a = -a;
 p = &a;
 printf("%d\n", sizeof(a));//4
 printf("%d\n", sizeof(int));//4
 printf("%d\n", sizeof a);//这样写行不行?//可以,输出4
 printf("%d\n", sizeof int);//这样写行不行?//不可以
 return 0;
}

5.2sizeof和数组

#include <stdio.h>
void test1(int arr[])
{
 printf("%d\n", sizeof(arr));//数组传参,形参可以是数组也可以是指针,但是本质是指针
}
void test2(char ch[])
{
 printf("%d\n", sizeof(ch));//
}
int main()
{
 int arr[10] = {0};
 char ch[10] = {0};
 printf("%d\n", sizeof(arr));//40
 printf("%d\n", sizeof(ch));//10
 test1(arr);//8或4
 test2(ch);//8或4
 return 0;
}

ps:数组传参,形参可以是数组也可以是指针,但是本质是指针。

6.关系操作符

>
>=

<

<=

!=        不等于

==        相等

7.逻辑操作符

&&        逻辑与      并且的关系,两个都要为真

||           逻辑或       只需要满足一个为真即可

8.条件操作符

exp1?exp2:exp3

表达式1成立,则执行表达式2,表达式3不执行。

表达式1不成立,则执行表达式3,表达式2不执行。

9.逗号表达式

exp1,exp2,exp3,……expN

从左向右执行,整个表达式的结果是最后一个表达式的结果。

10.下标引用、函数调用和结构成员

1.[] 下标引用操作符
操作数:一个数组名 + 一个索引值

例如:int arr[10];  //创建数组
arr[9] = 10;  //实用下标引用操作符。
[] 的两个操作数是arr和9。

2. () 函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

3. 访问一个结构的成员

. 结构体.成员名

-> 结构体指针->成员名

#include <stdio.h>
struct Stu
{
 char name[10];
 int age;
 char sex[5];
 double score;
};
void set_age1(struct Stu stu)
{
 stu.age = 18;
}
void set_age2(struct Stu* pStu)
{
 pStu->age = 18;//结构成员访问
}
int main()
{
 struct Stu stu;
 struct Stu* pStu = &stu;//结构成员访问
 
 stu.age = 20;//结构成员访问
 set_age1(stu);
 
 pStu->age = 20;//结构成员访问
 set_age2(pStu);
 return 0;
}

11.表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定。同样,有些表达式的操作数在求值得过程中可能需要转换为其它类型。

11.1隐式类型转换

C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

例子:

char a,b,c;

……

a=b+c;

b和c得值被提升为普通整形,然后再执行加法运算。加法运算完后,结果将被截断,然后再存储于a中。

11.2算数转换

如果某个操作符得各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

long double
double
float
unsigned long int
long int
unsigned int
int

如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运 算。

ps:但是算术转换要合理,要不然会有一些潜在的问题。

11.3操作符的属性

复杂表达式的求值有三个影响的因素。
1. 操作符的优先级
2. 操作符的结合性
3. 是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值