c语言:操作符

本文详细介绍了C语言中的各种操作符,包括算术、移位、位、赋值、单目、关系、逻辑、条件和逗号操作符。重点讲解了移位操作符的左右移位以及位操作符的按位与、按位或和按位异或,并通过实例演示了它们的用法。还探讨了结构体的创建和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作符

一.算术操作符: + - * % /

1.除了%操作符之外,其他的几个操作符可以作用与整数和浮点数,如:5%2.0//error.

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

3.%操作符的两个操作数必须为整数。

二.移位操作符:<<  >>

1.<<左移操作符:左边抛弃,右边补0

int num = 10;

//00000000000000000000000000001010//num在内存中的二进制

num<<1

//00000000000000000000000000010100

2.>> 右移操作符 ( 移动的是二进制位)

右移操作符有两种移动:

(1).算术右移,移动的是补码,右边丢弃,左边以和符号位一样的数字进行补位:0为正,1为负。

(2).逻辑右移,右边丢弃,左边补0。

如果为正数,代码演示如下:

#include <stdio.h>
int main()
{
    int a = 16;//16放在a里,a是整型,4个字节,32个比特位
    int b=a>>1;//将a的值右移赋值给b,00000000000000000000000000010000
    //右移一个把0丢弃,左边补0
    printf("%d\n",b);
    return 0;
}

运行结果为:8

如果为负数:例如:(代码如下:)

#include <stdio.h>
int main()
{
    int a = -1
    //我们假设,a是-1。原码是:10000000000000000000000000000001
    //对于正数,反码与其原码相同;对于负数,反码是在其原码的基础上,符号位保持不变,其他位按位取反,即把0变为1,1变为0。则反码是:11111111111111111111111111111110
    //补码是:对于正数,补码与其反码相同;对于正数,其补码与其原码相同。而对于负数,其补码是通过对其原码按位取反后加1得到。(即反码最后一位加1得到补码)补码:11111111111111111111111111111111
    //这样子内存中存储-1的补码为32个1
    int a = >>1;
    //算术右移:11111111111111111111111111111111//左边用原值的符号位填充
    //逻辑右移:01111111111111111111111111111111//右移,左边补0;
}

警告⚠:

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

例如:

int num =10;
num>>-1;//error

三、位操作符

1.位操作符:

& //按位与    | //按位或   ^按位异或  

注:他们的操作数必须是整数

2.位操作符的使用

(1)&有一个0则为0,两个为1才为1.

例如:

#include <stdio.h>
int main()
{
    int a = 3;//3的二进制是011,int整型则是4个字节,32个bie位
    //则是:        00000000000000000000000000000011
    int b = 5;//同理:00000000000000000000000000000101
    int c = a & b;//    00000000000000000000000000000001
    printf("%d", c);
    return 0;
}

运行结果:

(2)按位或 |

按位或:按照二进制或,有一个1则为1

例如:

#include <stdio.h>
int main()
{
    int a = 3;//    00000000000000000000000000000011;
    int b = 5;//    00000000000000000000000000000101;
    int c = a | b;//00000000000000000000000000000111;
    printf("%d", c);//c=1+1*2+1*2*2=7;
    return 0;
}

运行结果如下

(3)按位异或^

^(按2进制按位异或)//相同为0,相异为1

例如:

#include <stdio.h>
int main()
{
    int a = 3;//    00000000000000000000000000000011;
    int b = 5;//    00000000000000000000000000000101;
    int c = a ^ b;//00000000000000000000000000000110;
    printf("%d", c);//c=0+1*2+1*2*2=6;
    return 0;
}

运行结果如下:

(4)一道变态的面试题

题目:不能创建临时变量(第三个变量),实现两个数的交换,代码有两种方法,详细的发到了我的作品里,其中一种如下:

#include <stdio.h>
int main()
{
    int a = 3;
    int b = 5;
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("a=%d b=%d", a, b);
    return 0;
}

四.赋值操作符

+= -= *= /= %= 

>>=  <<=  &=  |=  ^=

其中这些运算符都可以写成符合的效果

比如:

int x= 10;
x= x+ 10;
x+= 10;//复合赋值
//其他运算符也都可以这样写,这样写的好处是更加简洁

五.单目操作符

1.单目操作符的内容:!- + & sizeof ~ ++ *(间接访问操作符 )(解引用操作符)  (类型)强制转换类型

2.演示代码

#include <stdio.h>
int main()
{
    int a=10;
    int*p=&a;
    //*p,解引用操作符——>通过p里面存放的地址找到对象a中存放的值
    //*p=20,a中的值变为20
    *p=20;
    printf("%d",a);
    return 0;
}

3.sizeof的使用:

sizeof计算变量所占空间的大小:单位是字节

注意:sizeof()内部不参与运算,例如sizeof(s=a+5);

例如:

char *p=&c;
printf("%d",sizeof(p));//4
int arr[10]={0};
printf("%d",sizeof(arr));//40

 4.~的使用按位取反(对一个数的二进制按位取反)

#include <stdio.h>
int main()
{
	int a = 0;
	//(按二进制的每一位取反)—>对补码按位取反
	//00000000000000000000000000000000补码按位取反
	//11111111111111111111111111111111
	//11111111111111111111111111111110反码(补码减一)
	//10000000000000000000000000000001原码(转化为10进制-1)
	printf("%d\n",~a);
	return 0;
}

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

#include <stdio.h>
int main()
{
	int num = 20;
	int* p = &num;
	*p = 30;//解引用操作符
	printf("%d\n",num);//30
	return 0;
}

6.(类型) 强制类型转换

#include <stdio.h>
int main()
{
	int a = (int)3.14;
	//int a=int(3.14)->errror
	printf("%d", a);//3
	return 0;
}

六.关系操作符

关系操作符:> >= <= < != ==

七.逻辑操作符

&& || 

&&的举例

#include <stdio.h>
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	printf(" %d %d %d %d",a,b,c,d);//a=1 b=2 c=3 d=4 i=0
	return 0;
}

||的举例

#include <stdio.h>
int main()
{
	int i = 0, a = 1, b = 2, c = 3, d = 4;
	i = a++ || ++b || d++;//有一真则真就短路了
	printf(" %d %d %d %d",a,b,c,d);//a=2 b=2 c=3 d=4 i=1
	return 0;
}

八.条件操作符 

1.exp1?exp2:exp3(三目操作符)

表达式1如果为真则输出表达式2,反之输出表达式3

九.逗号表达式

内容:(从左到右依次执行,结果为最后一个表达式的结果)

十.下标引用[ ]

[ ]下标引用操作符

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

例如:  

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

十.创建一个结构体

struct stu// struct 结构体关键字

{

        //成员变量 

        char name[20];

        int age;

        char id[20];

};

int main()

{

        struct stu s1={"工藤新一", 18,“5201314”};

        printf("%s\n",s1.name);

        printf("%s\n",s1.age);

        printf("%s\n",s1.id);

        return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值