C语言操作符

1.操作符:指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。不同的指令用操作符这个字段的不同编码来表示,每一种编码代表一种指令。

2.C语言操作符的分类:

 1. 算数操作数 
 2. 移位操作符 
 3. 位操作 
 4. 赋值操作符
 5.  单目操作符
 6. 关系操作符 
 7. 逻辑操作符 
 8. 条件操作符
 9.  逗号表达式
 10. 下标引用,函数调用和结构成员这里插入代码片

算术操作符(不要移动负数位):

算术操作符有:+  -  *  /   %

注意:

  *.除了‘%’操作符之外,其他的几个操作符可以作用于整数和浮点数。
  *.对于‘/’操作符如果执行两个操作都为整数,执行整数除法。而浮点数执行的就是浮点数除法。
  *.‘%’操作符的两个操作符必须为整数,返回的是整除之后的余数。

移位操作符:

(1).移位操作符:位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。

(2).移位操作符分类:

 左移操作符(把一个数的所有位都向左移动若干位):<<
 右移操作符(把一个数的所有位都向右移动若干位):>>

(3).移位规则:

*.  左移规则:左边抛弃,右边补0。
 int num=10;
                 "00000000000000000000000000001010" //在内存中的二进制
       丢掉<-(0)"00000000000000000000000000010100" //左移结果
   注意:左移先将数据存在CPU中,例如int类型空间有32个比特位,高位移出,低位补0;

            一个数在自身没有赋值的情况下,自身的值不会变。

*.右移规则:逻辑移位(左边用0填充,右边丢弃),算术移位(左边用该值的符号填充,右边丢弃)

  int num=-1;
 在内存中储存的补码为32个全一;
算术右移:左边用符号位填充
‘11111111111111111111111111111111’(1)->丢弃     因为num是负数所以左边补1逻辑 
逻辑右移:左边补0
‘01111111111111111111111111111111’(1)->丢弃   

总结:左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.

位操作符:

1,位操作符有:&(按位与),|(按位或),^(按位异或)

2.位操作符的操作数必须为整数。

  1. (1)按位与运算:

       按位  “与”  运算符     &   的作用是对运算符两侧以二进制表达的操作数按位分别进行  “与”  运算,而这一运算是以   数中相同的位  (bit)  为单位的。操作的规则是:仅当两个操作数都为  1  时,输出的结果才为  1  ,否则为  0     。   
    

如:


int a=1;
int b=2;
int main(){
     a&b;
}
结果为0
     1:00000……001
&    2:00000……010
    ---------------
     0:00000……000

(2)按位或运算:

        按位  “或”     运算符     |   的作用是对运算符两侧以二进制表达的操作数按位分别进行  “或”  运算,而这一运算是以数中相同的位  (bit)  为单位的。操作的规则是:仅当两个操作数都为  0  时,输出的结果才为  0  ,否则为  1  。

如:

int a=1;
int b=2;
int main(){
     a&b;
}
结果为0
     1:00000……001
|    2:00000……010
    ---------------
     3:00000……011

(3)按位异或运算:

   按位  “异或”  运算符     ^   的作用是对运算符两侧以二进制表达的操作数按位分别进行  “异  或”运算,而这一运算是以数中相同的位  (bit)  为单位的。异或运算操作的规则是:仅当两个  操作数不同时,相应的输出结果才为  1  ,否则为  0  。

 运算规则:相同比特位异或就会清零,任何数和零异或等于它本身;

如:

在int a=1;
int b=2;
int main(){
     a&b;
}
结果为0
     1:00000……001
^    2:00000……010
    ---------------
     3:00000……011这里插入代码片

异或运算例题:不创建临时变量,实现两个数的交换。

int main(){
     int a=10;
     int b=20;
     a=a^b;
     b=a^b;
     a=a^b;
}

赋值操作符:

1.赋值操作符‘=’,由“=”链接的表达式为赋值表达式。

2.如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。

3.在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。

如:


int a=2;
a=a+2; ->可以简写成:a+=2   

单目操作符:

1.单目运算符是指运算所需变量为一个的运算符,又叫一元运算符。

2.单目运算符分类:逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++, --】、负号运算符【-】、类型转换运算符【(类型)】(只改变类型不改变值)、指针运算符和取地址运算符【*和&】、长度运算符【sizeof】()

  1. 自增和自减【++,–】

(1)前置++和–:先进行自增或自减,然后在在进行操作。

如:

int main(){
    int a=2;
    int x=++a; //先自增,然后在赋值。x为3
    int x=--a; //先自减,然后在赋值。x为1
}

(2)后置++和–:先对数值进行赋值等操作,然后在自增或自减。

      原理:先创建一个临时变量存放原来的值,然后原值在进行++或--。赋值的时候讲临时变量进行赋值。

如:

int main(){
    int a=2;
    int x=++a; //先赋值,然后在自增。x为2,a的值为3
    int x=--a; //先赋值,然后在自减。x为3,a的值为2
}

关系操作符:

  1. 关系操作符有:(<) 小于 , (<= )小于等于 , (>) 大于 ,(>= )大于等于 , (==) 相等 , (!=) 不等。

2.在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。

3.关系运算符的运算结果只有 0 或 1。当条件成立时结果为 1,条件不成立结果为 0。

逻辑操作符:

1.分类:(&&)逻辑与,(||) 逻辑或 。

2.逻辑操作符将其操作数视为条件表达式:首先对操作数求值;若结果为0,则条件为假(false),否则为真(true).仅当逻辑与(&&)操作符的两个操作数都为true,其结果才得true.对于逻辑或(||)操作符,只要两个操作符之一为true,它的值就为true.

3.逻辑与:也是只有两个操作数都是true,结果才是true。但是如果左边操作数为false,就不计算右边的表达式,直接得出 false。

逻辑或:如果一个操作数或多个操作数为 true,则逻辑或运算符返回布尔值 true;只有全部操作数为false,结果才是 false。

例题:


int main(){
     int i=0,a=0,b=2,c=3,d=3;
     (1) i=a++&&++b&&d++;    //i=a++条件为假,后面程序不执行
     (2) i=a++&&++b&&d++;    //i=a++条件为假,++b条件为真,后面代码不执行
ptintf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}
运行结果:(1)abcd:1234

                  (2)abcd:1334

条件操作符:

1.(条件表达式)?(条件为真时的表达式):(条件为假时的表达式)。

2.含有条件操作符的表达称为条件表达式。


if(a>4)
   b=3;
else b=1;
换成条件表达式为:
int z=a>4?3:1;

逗号表达式:

1.逗号表达式是一种特殊的运算符,它可以将两个表达式连接起来,逗号表达式的一般形式是:exp1,exp2,……expn。

2.求解顺序是:先求解表达式1,再求解表达式2,依次类推.整个逗号表达式的值是最后一个表达式的值。

3.例题::(a = 3,b = 5,b+ = a,c = b* 5) 逗号表达式的值为40.

下标引用,函数调用和结构成员:

1.下标引用:[]

操作数:一个数组名+一个索引值

如:

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

2.函数调用操作符:()。

接受一个或者多个操作数,第一个操作是函数名,剩余的操作数就是传递给函数的参数。

例:

void test1(){
    printf("hello\n");
}
void test2(const char*str){
    printf("%s\n",str);
}
int main(){
    tset();       //实用()作为函数调用操作符
    test2("holle"); //实用()作为函数调用操作符
}```

3.访问一个结构体的成员:结构体。成员

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

例:

struct Stu  

{
char name[10];
int age;
char sex[5];
double score;
};

void set_age1(struct Stu stu)
{
stu.age = 10;
}
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;  

}


操作符的优先级和结合性:

1.优先级:就是当有多个运算符在同一个表达式中出现时,先执行哪个运算符。

2.结合性:就是当一个运算符多次出现时,先执行哪个运算符。

3.在同一表达式中,先执行优先级高的运算符,然后再执行优先级低的运算符;优先级相同的按结合性从左向右或从右向左的顺序执行。

下面为操作符优先级表:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019033121303383.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE0MTg4MQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190331212910504.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE0MTg4MQ==,size_16,color_FFFFFF,t_70)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值