操作符详解
算术操作符
+ - * / %
%操作符的两个操作数必须为整数, 除了% 操作符之外,其他几个可以用于整数和浮数。
对于/操作符如果两个操作数都是整数,执行整数除法。只要有浮点数就执行的是浮点数除法。
移位操作符
右移操作数 >>
移位规则:逻辑移位 ,左边用零填充,右边丢弃
算术移位,左边用原该值的符号位填充,右边丢弃
左移操作数 <<
移位规则:左边抛弃,右边补零
# include <stdio.h>
# include <stdlib.h>
void main ()
{
int a=13;
int b=0;
printf ("%d\n",b=a<<1); //26 01101——11010
printf ("%d\n",b=a>>1); // 6 01101——00110
printf ("%d\n",a); //13
system ("pause");
}
在移位操作符中,有代码可看出原有变量如果莫有操作时赋值给自己,则本身自己值不变。
位操作符
& 按位与
| 按位或
^ 按位异或
注:操作数必须是整数
编程中可以用位操作符
1,一组数中都出现偶数次,莫个数时只出现奇数次,可全部异或找出此出现此奇数次数
2,一个整数的二进制中1的个数等
int main ()
> {
> int num=-1;
> int i=0;
> int count=0;
> for (i=0;i<=32;i++) // while (num)
> {
> if ((num>>i)&1)==1) //count ++;
> count++; / /num=num&(num-1);
> }
> printf ("%d",count);
> return 0;
> }
赋值操作符
=
这个操作符很常用,基本只要写代码就会有,特别注意=和==的区别,在使用时应注意出现错误
**复合操作符
+=
*=
/=
%=
<<== >>==
&=
|=
^=
int x=10;
x=x+10;
x+=10; //后两句作用相同,以上操作法用法一样
单目操作符
! 逻辑反操作
± 正负值
* 间接访问(解引用操作符)
++ - - 前置后置加加减减
( ) 强制类型转换
~ 对二进制按位取反
sizeof 操作数的类型长度 (字节为单位)
sizeof :
short s=4;
int a=3;
printf ("%d",sizeof (s=a+10); //2 ————内部不参与运算
printf ("%d\n",s) //4
int main ()
{
int a=-10;
int *p=NULL;
printf ("%d\n",!2); //0
printf ("%d\n",!0); //1
a=-a;
p=&a;
printf ("%d\n",sizeof(a)); //4
printf ("%d\n",sizeof(int)); //4
printf ("%d\n",sizeof a); //4
printf ("%d\n",sizeof int); //错误,计算类型要带括号
return 0;
}
# include <stdio.h>
# include <stdlib.h>
void test1 (int arr[])
{
printf ("%d\n",sizeof (arr));
}
void test2 (char ch[])
{
printf ("%d\n",sizeof (ch));
}
int main ()
{
int arr[10]={0};
char ch[10]={0};
printf ("%d\n",sizeof (arr)); //40——数组的大小 4*10 (类型大小*数组元素个数)
printf ("%d\n",sizeof (ch)); //10——数组的大小1*10
test1 (arr); //4
test2 (ch); //4——指针大小在32位平台都是4个字节,64位平台是8个字节
system ("pause");
return 0;
}
编程中用到:
int a=13;
……00000000000001101
把任意一位改为1/0,按位与/或取反操作,在使用<<或>>
#include <stdio.h>
int set_bit(int a, int pos, int flag)
{
int b = 1 << (pos - 1);
if (flag == 0)
{
a &= ~b;
}
else
{
a |= b;
}
return a;
}
int main()
{ int e=0;
int g=0;
int c=0;
int ret=0;
printf ("输入一个数,操作数,置1或0\n");
scanf ("%d%d%d",&e,&g,&c);
ret=set_bit(e,g,c);
printf("%d\n", ret);
return 0;
}
注意++ - -前置后置使用
int a=10;
int b=0;
b=- -a; //先- -后使用
b=++a; //先++后使用
b=a++; //先使用后++
b=a–; //先使用后- -
int i=1;
int ret=(++i)+(++i)+(++i);
这样的代码在不同的编译环境中会出现不同的结果,因此再写代码中应慎用
关系操作符
>=
<=
>
<
!=
==
操作符运算简单,但应该注意区分使用=和==
逻辑运算符
&&
||
应注意区分使用逻辑与和按位与,逻辑或和按位或
1&2——0
1&&2——1
1|2——3
1||2——1
&&在使用时应注意,如果左边为假,后边操作就不执行了
||在使用时应注意,如果左边为真,后边操作就不执行了
条件操作符
a1 ?a2 : a3
相当于if语句,如果a1为真就执行a2,否则就执行a3
逗号操作符
, , , ,
从左向右执行,整个表达式结果是最后一个表达式的结果
int a=1;
int b=2
int c=(a>b,a=b+10,a,b=a+1)
//c=13 (0,12,1,13)
下表引用,函数调用和机构成员
[]
操作数:一个数组名+一个索引值
()
操作数: 接受一个或多个操作数,第一个操作数是函数名,剩余的操作数就是传递给函数的参数。——一个函数最少有一个操作数
. 结构体.成员名
-> 机构体指针->成员名
一般在结构体中会常用到
例如:
# include <stdio.h>
# include <stdlib.h>
struct s
{
int data[1000];
int num;
};
struct s si={{1,2,3,4},20};
void print1 (struct s si)
{
printf ("%d\n",si.num); 结构体成员访问
}
void print2 (struct s* ps)
{
printf ("%d\n",ps->num); //结构体成员访问
}
int main ()
{
print1 (si);
print2 (&si);
system ("pause");
return 0;
}