C语言操作符
操作符分类:
⑴算数操作符 ( + - * / % )
⑵移位操作符 (<< >>)
⑶位操作符 (& | ^)
⑷赋值操作符 (=)
⑸复合赋值符 (+= -= *= /= %= >>= <<= &= |= ^=)
⑹单目运算符 (! - + & sizeof ~ -- ++ * (类型),)
⑺关系操作符 (> >= < <= != ==)
⑻逻辑操作符 (&& ||)
⑼条件操作符 (exp1?exp2:exp3)
⑽逗号表达式 (exp1,exp2,exp3,…….expN)
⑾结构成员运算符 (. –> )
一.算数操作符
+ - * / %
使用注意事项:
1. 除了%操作符以外的运算符的操作数都可以是任何算术类型(即整数和浮点数)。
2. %运算符要求参与运算的运算对象必须是整数,返回的结果也是整数
3. /运算符,若两个操作数其中有一个为浮点数则相除的结果也是浮点数,两个整数相除的结果为整数
代码举例:#include<stdio.h>
#include<stdlib.h>
intmain()
{
float a =18.0;
int b = 10;
float c =0.0;
printf("a+ b=%f\n", a + b);
printf("%d\n", a % b);//%运算符的两个操作数必须为整数
printf("a- b=%f\n", a - b);
printf("a* b=%f\n", a * b);
printf("a/ b=%f\n", a / b);
system("pause");
return 0;
}
二.移位操作符
<< 左移操作符
>> 右移操作符
使用注意事项:
1. 若左移操作符的操作数是二进制数,结果相当于给原操作数乘以2的效果
2. 左移操作符:左边抛弃,右边补0
3. 若右移操作符的操作数是二进制数,结果相当于给原操作数除以2的效果
4. 右移操作符又分为算术右移和逻辑右移
5. 算术右移:左边用原该值的的符号位填充
6. 逻辑右移:左边补0,右边丢弃
代码举例:
#include<stdio.h>
#include<stdlib.h>
intmain()
{
int num =1;
printf("%d\n",num<<1);
printf("%d\n",num >> 1);
system("pause");
return 0;
}
#include<stdio.h>
#include<stdlib.h>
intmain()
{
int num=-1;
printf("%d\n",num<<1);
printf("%d\n",num >> 1);
system("pause");
return 0;
}
三.位操作符
& 按位与
| 按位或
^ 按位异或
使用注意事项:
1. 这些位操作符的操作数必须是整数
代码举例:
#include<stdio.h>
#include<stdlib.h>
intmain()
{
int num1 =1;
int num2 =2;
printf("%d\n",num1&num2);
printf("%d\n",num1|num2);
printf("%d\n",num1^num2);
system("pause");
return 0;
}
四.赋值操作符
代码举例
#include<stdio.h>
#include<stdlib.h>
intmain()
{
int weight= 120;
weight = 89;
double salary= 10000.0;
salary = 20000.0;
system("pause");
return 0;
}
使用注意事项:
1. 赋值操作符可以连续使用
如:int a = 10;
intx = 0;
inty = 20;
a = x = y + 1;
2. 复合赋值符
( += -= *= /= %= >>= <<= &= |= ^= )
以上这些操作符都可以写成复合的效果
代码举例:
#include<stdio.h>
#include<stdlib.h>
intmain()
{
int x = 10;
x = x + 10;
x += 10;//该式与x=x+10是等同的
system("pause");
return 0;
}
五.单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
Sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型), 强制类型转换转换
代码举例:
#include<stdio.h>
#include<stdlib.h>
intmain()
{
int a =-10;//-代表负值
int *p = NULL;
printf("%d\n",!2);//返回值为0;
printf("%d\n",!0);//返回值为1;
a = -a;
p = &a;//将a的地址赋给p
system("pause");
return 0;
}
1. 单目运算符sizeof的用法及注意事项
sizeof不是函数是一个单目运算符,因此运算时可以不加括号
代码举例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = -10;
printf("%d\n",sizeof(a));//4
printf("%d\n",sizeof(int));//4 求int 所创建的变量的字节的大小
printf("%d\n",sizeof a);//4 sizeof不是函数是一个单目运算符,因此运算时可以不加括号
/*printf("%d\n",sizeof int);*/ //不加括号不可以
system("pause");
return 0;
}
2.sizeof和数组
代码举例:
#include<stdio.h>
#include<stdlib.h>
void test1(int arr[])
{
printf("%d\n",sizeof(arr));
}
void test2(int ch[])
{
printf("%d\n",sizeof(ch));
}
int main()
{
int arr[10] = { 0 };
char ch[10] = { 0 };
printf("%d\n",sizeof(arr));//40
1.计算的是整个数组所占的字节长度
printf("%d\n",sizeof(ch));//10
2.计算的是整个数组所占的字节长度,ch定义的为字符型数组,每一个字符占一个字节
test1(arr);//
3.输出为4
函数传参的时候传的是数组的首个元素地址,所以sizeof计算的是首元素字节的大小
test2(ch);//
4.输出为4
函数传参的时候传的是数组的首个元素地址,所以sizeof计算的是首元素字节的大小,地址的字节永远是4
system("pause");
return 0;
}
3.&、sizeof和数组
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr[10] = { 0 };
printf("%d\n",sizeof(arr));//1.40
①输出的是整个数组的大小,单位为字节;sizeof(数组名)--其中数组名表示的是整个数组
printf("%p\n",&arr);//
②输出的是整个数组的地址,&数组名--其中数组名表示整个数组
printf("%p\n",&arr + 1);//
③输出跳过了整个数组
system("pause");
return 0;
}
④除过上述两种情况之外,所有的数组名都表示的是数组首元素的地址
4.sizeof内部的表达式不参与运算
代码举例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 10;
short int s = 5;
printf("%d\n",sizeof(s = a + 4));//输出值为2,因为sizeof内部的表达式不参与运算
system("pause");
return 0;
}
5.//++和--运算符
代码举例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 10;
int x = ++a;
printf("x=%d,a=%d",x,a);//1.x=11,a=11
int y = --a;
printf("y=%d,a=%d",y, a);//2.y=9,a=9
int i = a++;
printf("i=%d,a=%d",i, a);//3.i=10,a=11
int j = a--;
printf("j=%d,a=%d",j, a);//4.j=10,a=9
system("pause");
return 0;
}
①.++a,先对a进行自增运算,然后再使用自增后a的值;
②--a,先对a进行自减运算,然后再使用自减后a的值;
③a++,先使用a的值,然后再对a进行自增运算;
④a--,先使用a的值,然后再对a进行自减运算;
6.~按位取反操作符
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("%d\n", ~0);
system("pause");
return 0;
}
//输出值为-1
~是一个可以对一个数的二进制按位取反的操作符
//00000000000000000000000000000000
//按位取反
//补码形式11111111111111111111111111111111
//反码形式11111111111111111111111111111110
//原码形式10000000000000000000000000000001即为-1
六.关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
七.逻辑操作符
&& 逻辑与 & 按位与
|| 逻辑或 | 按位或
1&2-------->0
1&&2------->1
1|2---------->3
1||2--------->1
逻辑与和逻辑或的特点:
代码举例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i = 0, a = 0, b =2, c = 3, d = 4;
/*i =a++&&++b&&d++;*/ //a=1,b=2,c=3,d=4
i=a++||++b||d++; //a=1,b=3,c=3,d=4
printf("a=%d\nb=%d\n c=%d\n d=%d\n", a, b, c, d);
system("pause");
return 0;
}
1.逻辑与前面为假,表达式后面不用计算
2.逻辑或前面为真,表达式后面不用计算
八.条件操作符
Exp1 ? exp2 : exp3
如:intb=(a>5)?(3):(-3)
上式等价于:
If(a>5)
{b=3;}
else
{b=-3}
九.逗号表达式
(exp1,exp2,exp3,…….expN)
使用时注意事项:
1. 逗号表达式,从左向右依次执行
2. 整个表达式的结果是最后一个表达式的结果
十.结构成员运算符
代码举例:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu
{
char name[20];
int age;
char id[15];
char sex[6];
};
void test(struct Stu* ps)
{
//strcpy(ps->name ,"张三");//strcpy函数为字符串拷贝函数
//ps->age = 9;
strcpy((*ps).name,"张三");
(*ps).age = 9;
}
int main()
{
struct Stu s;//s向内存申请空间存储成员信息
test(&s);
printf("%s\n",s.name);
printf("%d\n",s.age);
system("pause");
return 0;
}
struct结构体
访问结构体成员的两种方式:
1.结构体.成员名 如:strcpy((*ps).name,"张三"),(*ps).age = 9;
2.结构体指针->成员名 如:strcpy(ps->name, "张三") ;ps->age = 9;
这两种命名方式是等价的