C语言:运算符

个人博客网址:https://ljsblog.com

运算符(五)

分类

  • 算术操作符
  • 移位操作符
  • 位操作符
  • 赋值操作符
  • 单目操作符
  • 关系操作符
  • 逻辑操作符
  • 条件操作符
  • 逗号表达式
  • 其他操作符

算术操作符

+ - * / %
这几个操作符都是最基本的操作符,不做过多介绍,但要注意%只能用于整型。

移位操作符

>>(右移操作符) <<(左移操作符)
移位操作符移动的是二进制位

右移操作符
  1. 算术右移:需要考虑符号位,右边丢弃,左边补原符号位
  2. 逻辑右移,不需要考虑符号位,右边丢弃,左边补0

例如

#include <stdio.h>
int main()
{
	int a=16;
    //a
    //00000000000000000000000000010000
    //a>>1
    //00000000000000000000000000001000
	printf("%d\n",a>>1);//打印结果为8
	return 0;
}
左移操作符

左边丢弃。右边补0
例如

#include <stdio.h>
int main()
{
    int a=6;
    //a
    //00000000000000000000000000000110
    //a<<1
    //00000000000000000000000000001100
    printf("%d\n",a<<1);//12
    return 0;
}

注意

  1. 移位运算符的操作数必须是整数
  2. 不要移动负数位

位操作符

&(按位与) |(按位或) ^(按位异或)
位操作符的操作数必须是整数
例:

//&按二进制位与
#include <stdio.h>
int main()
{
    int a=4;
    int b=6;
    int c=a&b;
    //00000000000000000000000000000100
    //00000000000000000000000000000110
    //00000000000000000000000000000100
    printf("%d\n",c);//4
    return 0;
}
//|按二进制位或
#include <stdio.h>
int main()
{
    int a=4;
    int b=6;
    int c=a|b;
    //00000000000000000000000000000100
    //00000000000000000000000000000110
    //00000000000000000000000000000110
    printf("%d\n",c);//6
    return 0;
}
//^按二进制位异或
//相同为0,不同为1
#include <stdio.h>
int main()
{
    int a=4;
    int b=6;
    int c=a^b;
    //00000000000000000000000000000100
    //00000000000000000000000000000110
    //00000000000000000000000000000010
    printf("%d\n",c);//2
    return 0;
}
//交换两个int变量,不能使用第三个变量
#include <stdio.h>
int main()
{
    int a=0;
    int b=0;
    scanf("%d%d",&a,&b);
    a=a^b;
    b=a^b;
    a=a^b;
    printf("a=%d,b=%d\n",a,b);
    return 0;
}
/*
36 96
a=96,b=36
*/

赋值操作符

=、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>=
例如:

int a=10;
a+=2;//相当于a=a+2
a>>=1;//相当于a=a>>1
a&=1;//相当于a=a&1

单目操作符

只有一个操作数

!       //逻辑反操作  
-       //负值   
+       //正值   
&       //取地址
sizeof  //操作数的类型长度,以字节为单位
~       //对一个数的二进制按位取反  
--      //前置、后置--  
++      //前置、后置++  
*       //间接访问操作符,解引用操作符
(类型)  //强制类型转换

注:

  • &是取地址符,%p打印地址
  • ++,–的前置和后置
  • 数据在内存以补码形式存储,打印出来的是原码

例子:

//&,*p
#include <stdio.h>
int main()
{
    int a=0;
    int *p=&a;
    printf("%p\n",p);//打印a的地址
    return 0;
}
//前置后置
#include <stdio.h>
int main()
{
    int a=10,b=10;
    printf("%d\n",a++);//打印结果为10
    printf("%d\n",++a);//打印结果为12
    printf("%d\n",b--);//打印结果为10
    printf("%d\n",--b);//打印结果为8
}

//取反
#include <stdio.h>
int main()
{
    int a=0;
    //00000000000000000000000000000000
    //按位取反后
    //11111111111111111111111111111111  -补码
    //11111111111111111111111111111110  -反码
    //10000000000000000000000000000001  -原码  -1    
    printf("%d\n",~a);//打印结果为-1 
    return 0;
}

关系操作符

这几个操作都是最基本的操作符,不多做介绍,但要注意别把=和==混淆。
== >= <= < >

逻辑操作符

&&(逻辑与) ||(逻辑或)
注意区分逻辑与和按位与,逻辑或和按位或

1&2—>0 1&&2—>1
1|2—>3 1||2—>1

逻辑与若是左边为假,则结果直接为假,右边不会再算
逻辑或若是左边为真,则结果直接为真,右边不会再算
例子:

//逻辑与
#include <stdio.h>
int main()
{
	int a=0,b=1,c=2,i;
	i= a++ && ++b && ++c;
	printf("a=%d,b=%d,c=%d\n",a,b,c);//结果为a=1,b=1,c=2 
	return 0;
}
//逻辑或
#include <stdio.h>
int main()
{
	int a=1,b=2,c=3,i;
	i= a++ || ++b || ++c;
	printf("a=%d,b=%d,c=%d\n",a,b,c);//结果为a=2,b=2,c=3 
	return 0;
}

条件操作符

格式:表达式1?表达式2:表达式3
表达式1为真,则执行表达式2,表达式1为假,则执行表达式3
例:

#include <stdio.h>
int main()
{
    int a=3,b=0;
    b=a>5?-3:3;
    /*
    b=a>5?-3:3;
    等同于
    if(a>5)
    {
        b=-3;
    }
    else
    {
        b=3;
    }
    */
    printf("b=%d\n",b);//结果为3
    return 0;
}

逗号表达式

格式:表达式1,表达式2,表达式3,…表达式n
逗号表达式,就是用逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
例:

int a=1;
int b=2;
int c=(a>b,a=b+8,a,b=a+3);
printf("c=%d\n",c);//c=13

其他操作符

[]下标引用操作符

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

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

操作数:接受一个或者多个操作数,第一个操作数是函数名,其余操作数为传递给函数的参数。
例:

#include <stdio.h>
int max(int x,int y)
{
    return (x>y?x:y);
}
int main()
{
    int a=0;
    //调用函数时的()就是函数调用操作符
    a=max(10,20);
    printf("%d",a);//20
    return 0;
}
访问一个结构的成员
.     结构体.成员名  
->    结构体指针->成员名

例:

//结构体.成员名
#include <stdio.h>
//创建一个结构体类型 struct Stu
struct Stu
{
    char name[20];
    int age;
    char id[15];
};
int main()
{
    //使用struct Stu这个类型创建一个结构体变量s1并初始化
    struct Stu s1={"张三",21,"6666666"};
    printf("%s\n",s1.name);
    printf("%d\n",s1.age);
    printf("%s\n",s1.id);
    return 0;
}
/*打印结果
张三
21
6666666
*/
//结构体指针->成员名
#include <stdio.h>
//创建一个结构体类型 struct Stu
struct Stu
{
    char name[20];
    int age;
    char id[15];
};
int main()
{
    struct Stu s1={"张三",21,"6666666"};
    struct Stu* p=&s1;
    printf("%s\n",p->name);
    printf("%d\n",p->age);
    printf("%s\n",p->id);
    return 0;
}
/*打印结果
张三
21
6666666
*/
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值