【18.6.14】总结C语言中的操作符与表达式

  学习中总结出C语言中的操作符有众多。包括算术操作符,移位操作符,位操作符,赋值操作符等等。操作符是机会每一个编程中必须用到的。从简单的算术操作符+,-,*,/,%到赋值操作符=再到移位操作符<<>>等等等等每一个每一种都是加工数据必不可少的,可以说没有操作符,程序就没有意义。

  A算术操作符,算术操作符就是我们数学中的加减乘除取余数。但是注意的是①C语言中的“×”用符号“*”来表示。“÷”用“/”来表示。②两个实数相除时的结果是双精度实数,两个整数相除的结果也是整数,就比如说15/4。在数学中15/4=3.75,但是定义15和4都是整形,那么得到的结果取3.75的整数位,也就是3。

  B移位操作符,移位操作符是对数字转化为二进制后再转换为反码再转化为补码来进行移位的,这里就有了二进制转化的关系。现在计算机为我们提供了计算器,我们可以直接通过计算器来算出对应数的二进制码。然后再通过特定规律(最高符号位符号保留其余取饭)求得反码,再由反码最低位+1求得补码。进行移位操作,①但是为什么计算机不直接用原码而是用补码来存储数据呢?由于原码和反码中,+0与-0的表示并不相同。其实还有一个更重要的作用,就是利用高位溢出,将减法运算变成加法运算。补码负数表示范围可以多表示一个最负的数。(-2^n 整数 或者  -1 纯小数)n为2进制位数。然后在回归移位操作符,②左移<<,将整个二进制序列,左边抛弃,右边补0。③然后是右移操作符,右移操作符分为两种:逻辑右移和算术右移。逻辑右移和左移的类似,右边丢弃左边补0。但是感觉如果是负数左边补0,不就变成正数了?所以另一种就是算术右移,左边用原该值的符号位填充,右边丢弃。什么意思?简单说,原来是正数最高位补0,原来是负数,做高位补1。那么计算机到底用逻辑还是算术,这取决于编译器,有些采用逻辑右移,有些则是算术右移,现阶段,本人见过的多数是算术右移。
左移<<
#include<stdio.h>


int main()
{
	int i = 10;//正整数原码反码补码相同
	//二进制原码00000000000000000000000000001010
	//反码00000000000000000000000000001010
	//补码00000000000000000000000000001010
    printf("i = %d\n",i);
	i=i<<1;
	//补码向左移动,做高位0抛弃,在1010后补0
	//得到新的二进制补码00000000000000000000000000010100
	//转化为原码00000000000000000000000000010100
	//就是20
	printf("i = %d\n",i);
	return 0;
}

右移<<

#include<stdio.h>


int main()
{
	int i = -1;
	//二进制原码10000000000000000000000000000001
	//反码11111111111111111111111111111110
	//补码11111111111111111111111111111111
    printf("i = %d\n",i);
	i=i>>1;
	//补码向右移动,做高位补1,最低位1丢弃
	//得到新的二进制补码11111111111111111111111111111111
	//转化为原码10000000000000000000000000000001
	//就是-1
	printf("i = %d\n",i);
	return 0;
}

  C位操作符,位操作符对它们的操作数执行与,或,异或的逻辑操作。与“&”或“|”异或“^”。①先说&,针对两个二进制序,&操作时两个1得1,其余得0;那么就可以得知任何数字和1&就可以得到它对应二进制序列最低位的数字。如果是0,那么最低位就是0,如果是1,最低位就是1。从而可知如果每次都右移一位,在&1就可以得到对应二进制序列的每一位数字。②|,|的操作与&差不多,操作时。如果两个数都是0,那么结果为0,如果有一个1那么结果为1。③^,异或操作符是一种很巧妙的操作符,原理是对应二进制序列,相同存1,相异存0。在很多编程中,无法解决或者无法优化的时候,异或就可以得到。例如说,一个简单的找相同数字的题。如果存入数组一项一项的去对比,那么执行次数就太多了。这时候选择异或操作符,一列数123581,1^2^3^5^8当下一次^1的时候。就会输出2358原因是相同两个数的异或结果为0。

  举例:10&15

int main()
{
	int i = 10;
	//补码:00000000000000000000000000001010;
	int j = 15;
	//补码:00000000000000000000000000001111;
	//&结果:00000000000000000000000000001010;
	//结果为10的二进制补码
	printf("i = %d\n",i);
	printf("j = %d\n",j);
    i=i&j;
	printf("i = %d\n",i);
	return 0;
}

  举例:10|15

int main()
{
	int i = 10;
	//补码:00000000000000000000000000001010;
	int j = 15;
	//补码:00000000000000000000000000001111;
	//|结果:00000000000000000000000000001111;
	//结果为15的二进制补码
	printf("i = %d\n",i);
	printf("j = %d\n",j);
    i=i|j;
	printf("i = %d\n",i);
	return 0;
}
	

举例:10^15

int main()
{
	int i = 10;
	//补码:00000000000000000000000000001010;
	int j = 15;
	//补码:00000000000000000000000000001111;
	//^结果:00000000000000000000000000000101;
	//结果为5的二进制补码
	printf("i = %d\n",i);
	printf("j = %d\n",j);
    i=i^j;
	printf("i = %d\n",i);
	return 0;
}
	

举例:输出1254658的二进制序列对应的每一位

int main()
{
	int num = 1254658;
	int j = 0;//循环数
	int i = 0;//创造临时变量,防止NUM的大小改变
	printf("整数为%d\n",num);
	for(j=0;j<32;j++)
	{
		i=num>>j;//每次向右移1位
		printf("整数的二进制序列的第%d位为:%d\n",j+1,i&1);
	}
	return 0;
}

  D赋值操作符,基础赋值操作符只有=。他可以改变一个你不满意的值为一个你满意的值。且赋值操作符可以连续赋值。赋值操作符与其他操作符连着使用,就形成了复合赋值操作符。例如:+=,-=,^=等等。+=,a+=b就是把b的值加给a然后赋给a。其余复合操作符。用途大同小异。

  E单目操作符,单目操作符也有很多:!,++,--,&,sizeof,(类型),+等等。主要说一下几个。①!,是对他的操作进行逻辑反操作,如果操作数为真,那么结果为假,如果操作数为假,那么结果为真。②~,将原本操作进行求补操作,操作中原先的1变为0,原先的0变为1。③&取地址操作符。这里不是与,是取地址的意思,这个操作符在录入,指针中经常用到,意思就是产生它操作数的地址。④*间接访问操作符,通常伴随指针一起使用,后面也会写到。⑤(类型),这是一个强制类型转换符,意思就是将表达式的值强行转换一个类型。

  F关系操作符,<,>,<=,>=,==,!=这下操作符比较简单,没啥可说的。但是编码时包括本人就有经常会写出if(i=1)这种笑话。本来是用==判断是否与1相同。结果用了赋值操作,结果,默认为真。

  G逻辑操作符,分为逻辑与&&与逻辑或||,逻辑与和逻辑或有几个特点,比如说,当&&判断出有一侧为0或为假时,就不在判断,因为不管怎么判断,结果都已经是假。所以后面不再判断。当||判断出有一侧为真结果就是真。不在判断。

举例:&&

int main()
{
	int i = 0,a = 0,b = 2,c = 3,d = 4;
	i = a++&&++b&&d++;
	//a在执行前为0,判断为假。对于&&来说,就不在判断了。
	printf("a = %d\nb = %d\nc = %d\nd = %d\n",a,b,c,d);
	//所以只有a++变成了1,其余原样输出。
	//结果为1,2,3,4
	return 0;
}
举例:||
int main()
{
	int i = 0,a = 0,b = 2,c = 3,d = 4;
	i = a++||++b||d++;
	//a在执行前为0,判断为假。对于||来说,还需要判断,但是++b为3,为真就不在判断。
	printf("a = %d\nb = %d\nc = %d\nd = %d\n",a,b,c,d);
	//所以a++变成了1,++b变成了3其余原样输出。
	//结果为1,3,3,4
	return 0;
}

  H条件操作符,就是将if做了一个省略。原本的if(i>0){a++;}else{a--;}就可以写成i>0?a++:a--

  I逗号表达式,这个不多讲了,用逗号隔开。按顺序执行。

  J下标引用,函数调用和结构成员。①[],操作数:一个数组名+一个索引值。例如arr[10]数组名就是arr,索引值就是10。②这里说一下关于优先级的问题。再数学中乘除的运算大于加减,括号的运算大于乘除,再计算中也有自己的优先级。但是当不相邻的不同符号组合时。系统会无法判断优先级,从而程序成为一个错误的程序。

int main()
{
		int i = 1;
		int sum = 0;
		sum=(++i)+(++i)+(++i);
		//这里对三个括号从左到右标记为1,2,3两个加号从左到右标记为A,B
		//1,2的优先级大于A这是毋庸置疑的,2,3的优先级大于B这也是毋庸置疑的,但是1的优先级是否大于B
		//这是不确定的,所以计算机无法给出一个唯一的答案
		//再不同编译器地下,输出的结果也是不同的
		printf("%d\n",i);
		printf("%d\n",sum);
		return 0;
}

这些就是我在学习了操作符和表达式以后的学习总结。希望大佬可以指出不足,也希望不要嘲笑我这个刚刚混进来的菜B

猜你喜欢

转载自blog.csdn.net/weixin_39392653/article/details/80694950
今日推荐