学习中总结出C语言中的操作符有众多。包括算术操作符,移位操作符,位操作符,赋值操作符等等。操作符是机会每一个编程中必须用到的。从简单的算术操作符+,-,*,/,%到赋值操作符=再到移位操作符<<>>等等等等每一个每一种都是加工数据必不可少的,可以说没有操作符,程序就没有意义。
A算术操作符,算术操作符就是我们数学中的加减乘除取余数。但是注意的是①C语言中的“×”用符号“*”来表示。“÷”用“/”来表示。②两个实数相除时的结果是双精度实数,两个整数相除的结果也是整数,就比如说15/4。在数学中15/4=3.75,但是定义15和4都是整形,那么得到的结果取3.75的整数位,也就是3。
#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