ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[C语言]操作符

2021-12-11 10:33:52  阅读:139  来源: 互联网

标签:右移 int C语言 ++ 操作符 sizeof 表达式


目录

算术操作符

位移操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号操作符

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


算数操作符:+、-、*、/、%

注意:%的两个数都为整数,返回的是整除之后的余数

           /的两个数都为整数型,则返回的为整数型,当有一个为浮点型,则返回的为浮点型

移位操作符:>>、<<(不要移动负数位)

<<(左移操作符):把二进制位向左移动一位。左边丢弃,右边补零

>>(右移操作符):把二进制位向右移动一位。

1、算术右移:右边丢弃,左边补原符号(0为正1为负)

2、逻辑右移:右边丢弃,左边补0

思考下代码:

int main()
{
	int a = -1;
	int b = a >> 1;
	printf("%d",b);
	getchar();
	getchar();
	return 0;
}

整数的二进制形式存在:原码,反码(符号位不变,其余按位取反),补码(反码+1)

对于正整数来说这三个相同

负数在内存中存放的是二进制的补码

执行代码我们可以发现打印出来b的值为-1,所以上面执行的右移操作符是算数右移

(二进制)位操作符:与&、或|、非^(异或-->相同为0,相异为1)

笔试例题:交换两个int变量的值,不能使用第三个变量。

如下:

int main()
{
	int a = 5;
	int b = 3;
	a = a + b;
	b = a - b;//原来的a
	a = a - b;//原来的b
	printf("a=%d,b=%d", a, b);
	getchar();
	getchar();
	return 0;
}

但是上面代码存在:数值太大会溢出的问题。a^a=0,0^a=a

因此我们可以用异或解决,如下:a = a^b;
                                                      b = a^b;
                                                      a = a^b;

代码练习:打印出一个二进制位中含1的个数

思路:与1进行与,如果结果是1,则该数字二进制的最后一位是1,反之是0。二进制右移,以此判断。

代码如下:

int a = 0;
	scanf("%d", &a);
	int count=0;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if (((a >> i) & 1) == 1)
			count++;
	}
	printf("%d", count);

赋值操作符:+=、-=、>>=、<<=、%=、.....

单目操作符(只有一个操作符):!、+、-(负)、sizeof、~(所有二进制按位取反)……

注意:对于sizeof  sizeof(int)不能去掉(),但是sizeof(a)可以写成sizeof a,这证明了sizeof是一个操作符。

        int * pa=&a;--->*代表了pa是一个指针变量,

        *pa=20;*是一个间接访问操作符(*pa就是a)指针变量是专门用来存地址的

       ()--> 强制转换符     eg:int a=(int)3.14;

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

注意:比较两个字符串相等不能用==要用strcmp(引入#include<string.h>)

逻辑操作符:&&逻辑与、||逻辑或(判断真假)

笔试例题:判断下面代码:

	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++&&++b&&d++;
	printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);

答案是:1 2 3 4

那么为什么呢?因为a++是0时 i就已经是0了,所以后面的++b,d++就不算了。

那假如把&&换成||呢?答案是:1 3 3 4同样,在++b时 i就已经时1了,后面就不用执行了。

条件操作符(三目操作符): 表达式1?表达式2 :表达式3   ;

表达式1为真,进行表达式2.反之,进行表达式3。

逗号操作符(逗号表达式):表达式1,表达式2,表达式3……

从左到右计算,整个表达式的结果为最后一个表达式的结果。

下标引用、函数调用和成员结构操作符:

arr[4]-->[]为操作符,arr、4为操作数,缺一不可。

无参函数的调用test()-->()为操作符,test为操作数,若为有参函数,则参数也为操作数。

结构成员访问的操作符:.  ->

结构体:用struct 定义新的结构体类型

第一种结构体.成员 如下:

 第二种结构体指针->成员是将结构体变量的地址放在一个指针中,操作如下:

 整型提升:按照数据类型的符号位进行提升

什么时候提升?---达不到int的大小(short(2)、char(1))

eg:char a=-1;//(char 8个比特位)11111111

     提升后为:11111111111111111111111111111111

     unsigned char a=1;//00000001

     提升后为:00000000000000000000000000000001

 例题如下(截图转自比特鹏哥):

 本节结束……^-^

标签:右移,int,C语言,++,操作符,sizeof,表达式
来源: https://blog.csdn.net/m0_58454229/article/details/121805743

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有