C语言常用操作符

目录

算术操作符  +    -     *     /     %

移位操作符  <<  >>

位操作符     &    ^    |

&  按2进制位与

^  按2进制位异或 

|  按2进制位或

赋值操作符  =    +=  -=   *=   /=   &=   ^=    |=   >>=   <<=

单目操作符  !     -     +    &    sizeof    ~      --   ++     *       (类型)

!  逻辑反操作  

-  负值  +  正值

&  取地址

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

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

--  前置--、后置--   

++  前置++、后置++

(类型)  强制类型转换

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

逻辑操作符  ||   &&

条件操作符(三目操作符)  exp1 ? exp2 :exp3

逗号表达式  exp1,exp2,exp3……expn

下标引用,函数调用和结构成员  [ ]  ()  .   ->

[ ]下标引用操作符

 () 函数调用操作符

. 和 ->用于访问一个自定义成员

结构体

打印功能

改变结构体内的部分内容


算术操作符  +    -     *     /     %

移位操作符  <<  >>

位操作符     &    ^    |

  • &  按2进制位与

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 3;
        int b = 5;
	int c = a & b;
	printf("%d\n", c);
	return 0;
}

a=00000000 00000000 00000000 00000011 //int占位为4字节

b=00000000 00000000 00000000 00000101

c=00000000 00000000 00000000 00000001=1 //有0出0,全1出1

  • ^  按2进制位异或 

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

a=00000000 00000000 00000000 00000011 //int占位为4字节

b=00000000 00000000 00000000 00000101

c=00000000 00000000 00000000 00000110=6  //相同为0,不同为1

  • |  按2进制位或

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 3;
        int b = 5;
	int c = a | b;
	printf("%d\n", c);
	return 0;
}

a=00000000 00000000 00000000 00000011 //int占位为4字节

b=00000000 00000000 00000000 00000101

c=00000000 00000000 00000000 00000111=7  //有1出1

赋值操作符  =    +=  -=   *=   /=   &=   ^=    |=   >>=   <<=

int a = 10;//创建变量a,且初始化为10,初始化操作
a = 20;//赋值操作
a = a + 10;//可以写成a+=10
a = a - 8;//a-=8

单目操作符  !     -     +    &    sizeof    ~      --   ++     *       (类型)

单目即只有一个操作数

  • !  逻辑反操作  

int a = 10;
printf("%d\n", !a);//逻辑反操作,输出0
int a = 0;
printf("%d\n", !a);//逻辑反操作,输出1
if(!a) //a为假,进入if语
//非0是真,0是假
  • -  负值  +  正值

区别于+(加号):a+b,a和b是+的两个操作数,+称为双目操作符

  • &  取地址

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

int a=10;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(int));//两种写法一样
  • ~  对一个数的二进制按位取反

整数在内存中存储的时候,存储的是二进制,表示形式有3种:原码,反码,补码

有符号的整数,最高位是0,表示正数;最高位是0,表示负数

正的整数,原码=反码=补码;

负的整数,反码=原码符号位不变,其他位按位取反;补码=反码的二进制+1

内存中存储的是二进制的补码,计算的时候采用的也是补码

  • --  前置--、后置--   

  • ++  前置++、后置++

++a  前置++:先++,后使用

a++  后置++:先使用,后++

int a=2;
int b=(++a)+(++a)+(++a);//a=a+1    a+=1
printf("%d",b);

VS2019运行结果为12, Linux运行结果是10,尽量不写上述计算表达式,容易引起错误

  • (类型)  强制类型转换

int a=3.14;//3.14默认double类型,占8字节,输出会有警告
int a=(int)3.14;//把3.14强制转化为int类型,不会生成警告

尽量避免这种操作

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

=    用来赋值

==  用来判断相不相等,大小是否一致

逻辑操作符  ||   &&

  • &&  逻辑与
  • ||     逻辑或
int a=3;
int b=4;
if((a==3)&&(b==4))//a=3并且b=4,则输出哈哈
{
    printf("哈哈\n");
}
if((a==3)||(b==4))//a=3或者b=4,则输出呵呵
{
    printf("呵呵\n");
}

(a==3)  加括号是为了更方便的看出逻辑关系

条件操作符(三目操作符)  exp1 ? exp2 :exp3

int a = 10;
int b = 0;
if (a == 5)
{
	b = -6;
}
else
{
	b = 6;
}
b=((a==5)?-6:6);

以上两种编程语句表达的意思是一样的

逗号表达式  exp1,exp2,exp3……expn

int a=0;
int b=3;
int c=-1;
int d=(a=b-5,b=a-c,c=a+b,c-=5);

a=-2  b=-3  c=-5  c=-10 → d=-10

逗号表达式会从左向右依次计算,整个逗号表达式的结果是最后一个表达式的结果

下标引用,函数调用和结构成员  [ ]  ()  .   ->

  • [ ]下标引用操作符

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	printf("%p\n", &arr[4]);
	printf("%p\n", &4[arr]);
	//printf("%p\n", &[arr]4);//Err
	//printf("%p\n", &[4]arr);//Err
	return 0;
}
//[]是操作符,它的两个操作数为arr和4
  •  () 函数调用操作符

void test1()
{
	printf("hehe\n");
}
void test2(const char str[])
//const int *A; //const修饰指向的对象,A可变,A指向的对象不可变
//int const* A; //const修饰指向的对象,A可变,A指向的对象不可变
//int* const A; //const修饰指针A, A不可变,A指向的对象可变
//const int* const A;//指针A和A指向的对象都不可变
{
	printf("%s\n", str);
}
int main()
{
	test1();
	test2("hello bit.");
	return 0;
}
  • . 和 ->用于访问一个自定义成员

 两段代码等价,-> 可以理解为通过pb指针先找到b,然后再找到name

结构体

打印功能

  • 方法一

出错原因是定义结构体Book在函数print1之后,只要调换顺序即可解决

struct Book//自定义类型
{
	char name[20];
	float price;
	char id[10];
};
//结构体用于描述一个复杂对象

void print1(struct Book b)
{
	printf("书名:%s\n", b.name);
	printf("价格:%f\n", b.price);
	printf("书号:%s\n", b.id);
}

int main()
{
	struct Book b = { "C语言程序设计",55.5f,"C20211108" };
	print1(b);
	return 0;
}

  • 方法二:利用结构体指针打印内容

方法三:利用 ->,先通过pb找到b,再找到name

     

改变结构体内的部分内容

  • 方法一

上面的代码利用结构体类型struct Book创建了一个变量是struct Book b,b中有三个成员:name,price,id,在上述代码基础上,想要改变价格,可做如下改动

  • 方法二:strcpy

 而想要改书名为数据结构的时候,添加 b.name="数据结构"; ,系统会报错。因为name是一个数组名,代表一个地址常量,而“数据结构”应该放到地址所指向的空间中。可以利用strcpy

 

 希望大家多多批评指正!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值