c语言操作符分为:算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用. ,函数调用,结构成员
一.算术操作符 (+,-,*, /, %)
/ 两边如果都是整数 ,想要得到一个小数的话,至少要有一个是小数;
%两边必须都是整数
1.除了%操作符以外,其他的几个操作符都可以作用于整数和浮点数;
2.对于/操作符如果两个操作数都为整数,执行整数除法,而只要有浮点数执行的就是浮点数除法;
3.%操作符的两个操作数必须是整数,返回的是整除之后的余数
二.移位操作符(>>,<<)
右移操作符(有/2的效果)
1.算术右移:左边补的是原来的符号位,右边丢弃。
2.逻辑右移·:右边丢弃,左边补0。
在c中通常都是算术右移。且移动的是存储在内存中的二进制补码。
左移操作符(有*2的效果):直接左边丢弃,右边补0.
在进行移位操作的时候,不要出现移动负数位的情况。
三.位操作符:&(按位与),|(按位或),^(按位异或)
注意:他们的操作数都必须位整数。
&:按内存中存储的二进制位与 一个为0则为0;
|:按内存中存储的二进制位或 一个为1则为1;
^:按内存中存储的二进制位异或 相异为1,相同为0.
相关例题: 编写代码求一个整数存储在内存中二进制中1的个数。
#include<stdio.h>
int main(){
int num=0;
int count=0;
scanf("%d",&num);//num&1==1的话表示num最后一位为1,让num32位都依次移到最低位&1就可以得到二进制中
int i=0;
for(i=0;i<32;i++)
{if(1==((num>>i)&1))
count++;}
printf("%d\n"count);
return 0;}
四.赋值操作符 (=)
复合赋值(+= ,-= ,*= ,/= , %= , >>= , <<= , &= , |= ,^=)
五.单目操作符(只有一个操作数):! -(负值) +(正值) & sizeof() ~(按二进制位取反)
*(解引用操作符) -- ++(前后置) (类型) 强制类型转换。
sizeof()求大小时,对于变量可以省略括号,但是对于类型不行;sizeof()括号内部的表达式不参与运算。
#include<stdio.h>
int main(){
int a=11;
a=a|(1<<2);
printf("%d\n",a);//15
a=a&(~(1<<2));
printf("%d\n",a);//11
return 0;
}
六.关系操作符(> < >= <= != ==)
七.逻辑操作符(&& || )关注本身的真假
#include<stdio.h>
int main(){
int i=0,a=0,b=2,c=3,d=4;
i=a++&&++b &&d++;//前面为0后面的就不算了
i=a++ ||++b ||d++;//前面为1后面的就不算了
八.条件运算符(三目运算符)exp1 ? exp2 :exp3(表达式1的结果为真,表达式2的结果就为整个表达式的结果,表达式1的结果为假,表达式3的结果就为整个表达式的结果。)
九.逗号表达式:从左到右依次执行,但整个表达式结果是最右边的。
十:下标引用[] ,函数调用()操作符。
十一:->操作符 ,.操作符。
结构体变量.成员名 结构体指针->成员名==(*ps).name
表达式求值是由操作符的优先级和结合性决定的
隐式类型转换:整型提升(只要出现有char short参与运算的就转换为整型参与运算);算术转换(如果某个操作数的类型在这些排名较低,那么首先就要转换为另一个操作数的类型后再执行运算long double>double>float>unsigned long int>long int >unsigned int>int)。
整型提升实例:
#include<stdio.h>
int main()
{
char a=3;
//00000000 00000000 00000000 00000011
//00000011 ---a截断
char b=127;
//00000000 00000000 00000000 01111111
//01111111 ---b截断
char c=a+b; //整型提升的时候是按照变量符号位进行提升的
//00000000 00000000 00000000 00000011
//00000000 00000000 00000000 01111111
//00000000 00000000 00000000 10000010
/10000010--c 截断
printf("%d\n",c);//-126//打印的时候也再一次整型提升
//11111111 11111111 11111111 10000010
#include<stdio.h>
int main(){
char a=0xb6;//10110110
short b=0xb600;
int c=0xb6000000;
if(a==0xb6)//整型提升补齐11111111 11111111 11111111 10110110
printf("a");
if(b==0xb600)//整型提升补齐
printf("b");
if(c==0xb6000000)
printf("c");
return 0;}
//代码运行结果为c,因为a和b都经历了整型提升
#include<stdio.h>
int main(){
char c=1;
printf("%u\n",sizeof(c));//1
printf("%u\n",sizeof(+c));//4
printf("%u\n",sizeof(!c));//1
return 0;}