c语言操作符详解

一、算术操作符:+、 -、 *、 \、 %(取模)
1、双目操作符、自左向右、优先级排名 ±为4,其它三个为3,
2、对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法
3、% 操作符的两个操作数必须为整数(不能为浮点数),返回的是整除之后的余数

int a=5,b=2;
a/b==2; not 2.5
a%b==1;

二、移位操作符:左移 << 、和右移 >>
1、双目操作符,自左至右、优先级排名 5
2、左移操作符移位规则:左边抛弃、右边补0
3、右移操作符 移位规则:首先右移运算分两种:逻辑移位是左边用0填充、右边丢弃,算术移位是左边用原该值的符号位填充、右边丢弃
4、移位之后自身的值并未发生变化,因为没有进行赋值操作
5、不允许移动负数位,比如num<<-1就是错的

int num=00000000000000000000000000001010;
num<<1
移位后结果为 00000000000000000000000000010100;
int num=-1;在计算机中存为 11111111111111111111111111111111;
算术右移:11111111111111111111111111111111;
逻辑右移:01111111111111111111111111111111;

三、位操作符:& 按位与、| 按位或、^ 按位异或
1、双目操作符、自左向右、操作数必须是整数、 优先级排名 &,8、|10、^9
2、运算规则&(有0则0)、|(有1则1)、^(相同为0,不同为1)

#include <stdio.h>
int main()
{
 int num1 = 1;
 int num2 = 2;
 num1 & num2;  //0001&0010结果为0000 为0
 num1 | num2;   //0001|0010结果为0011 为3
 num1 ^ num2;  //0001^0010结果为0011 为3
 return  0;

四、赋值操作符:=(引申^=、%=等等)
1、双目运算符,自右向左、 优先级排名 14
2、可以连续赋值,但不推荐使用,会让读者很不明了
3、可以写成复合型式

int a=1,b=2,c=3;
a=b=c+2=b+1; //不推荐此类写法
int x = 10;
 x = x+10;
 x += 10;  //复合赋值,其它运算符也可以类似。

五、单目操作符:! 逻辑反、-负、+正、&取地址、sizeof 、~ 对一个数的二进制按位取反、-- ++、(类型)强制类型转换、 解引用操作符
1、单目运算符、自右向左运算、 优先级排名 2
2、先看两对前置++ --和后置++ –

i++和++i
int a=10;b=a++; //先使用后加加,执行完a=11 b=10;
int a=10;b=++a; //先加加后使用,执行完a=11,b=11;
i--和--i
int a=10;b=a--; //先使用后减减,执行完a=9 b=10;
int a=10;b=--a; //先减减后使用,执行完a=9,b=9;

3、取地址就是在内存中为其找一块地方,比如&a、&b.
4、特别注意sizeof是一个操作符,并不是函数,它是求字节的大小,比如sizeof(int)=4。
5、()功能为把表达式的运算结果强制转换为类型说明符所表示的类型

main()
{
float f=5.75;
printf("f=%d,f=%f\n",(int)f,f);
}
f=5,f=5.750000

六、关系操作符:>、>=、<、<=、!=、==
1、双目运算符、自左向右 、优先级排名 前四个是6、后两个是7
2、注意陷阱,运用时要细心

int a=1,b=2;
b==a;  //结果为假
b=a;  //结果为1

七、逻辑操作符:逻辑与&&、逻辑或||,也称短路与短路或
1、双目运算符、自左向右、 优先级排名 &&11、||12、
2、要区分和按位与按位或的区别,逻辑运算的结果为真或者假(1为真0为假),而按位与或会得到一个准确的值
3、&&:两个操作数为真,结果才为真,只要左边为假,就不计算右边了。||:全部操作数为假,结果才为假

1&2----->0; //0001&0010  0000
1&&2---->1;//为真。
1|2----->3; //0001|0010  0011
1||2---->1; // 为真

八、条件操作符: ?:
1、三目运算符,三个操作数、自右向左、 优先级排名 13
2、用于简单的if else 语句判断

if (a > 5)
        b = 3;
else
        b = -3;
即a>5 ? 3 : -3

**九、逗号表达式:,**逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
1、自左向右、 优先级排名 15

int a = 2;
int b = 1;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
c是多少? c是12

十、下标引用、函数调用和结构成员、 优先级排名
1.[ ] 下标引用操作符
操作数:一个数组名 + 一个索引值

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

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
 }

KEY:表达式求值和整型提升:
表达式求值的顺序一部分是由操作符的优先级和结合性决定,同样有些表达式的操作数在求值的过程中可能需要转换为其他类型,C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度,通用CPU是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这
种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned,然后cpu才能去计算。
如何进行整型提升?
整形提升是按照变量的数据类型的符号位来提升的
1`负数的整形提升

char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111

2、正数的整型提升

char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001

3、无符号整形提升,高位补0
4、整型提升实例

int main()
{
 char a = 0xb6;
 short b = 0xb600;
 int c = 0xb6000000;
 if(a==0xb6)
 printf("a");
 if(b==0xb600)
 printf("b");
 if(c==0xb6000000)
 printf("c");  //只打印c;
 return 0;
}

算术转换
算术转换规则

long double              从
double                   下
float                    往
unsigned long int        上
long int                 依
unsigned int             次
int                      转
char,short               换

警告: 但是算术转换要合理,要不然会有一些潜在的问题,比如精度丢失

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值