一.算术操作符(+、-、*、/、%)
注意:1.这些操作符都为双目操作符,拥有左操作数和右操作数。
eg:int a = 1(左操作数) + 2(右操作数);
2.对于/,若两个操作数为整数执行整数除法;若有一个操作数为浮点数执行浮点数除法。
3.对于%,只能对整数取模,返回的是整除后的余数。
eg: 9.0%3.0 是错误的。
二.移位操作符(<<、>>)
注意:1.<<(左移操作符):<<1:将二进制左边丢一位,右边补0(左移一位有*2的效果)
2.>> (右移操作符):①算术右移>>1:将二进制右边丢一位,左边补原该值的符合位
②逻辑右移>>1:将二进制右边丢一位,左边补0 (右移一位有/2的效果)
三、位操作符(&、|、^)
注意:他们的操作数必须是整数。(按位与、或、异或)
eg:不能创建临时变量(第三个变量),实现两个数的交换。
#include<stdio.h>
int main()
{
int num1 = 3; //011
int num2 = 5; //101
num1 = num1^num2; //110 异或(对应二进制为相同为0;相异为1)
num2 = num1^num2; //011 数字在内存中存的是补码,拿补码与,或,异或
num1 = num1^num2; //101
printf(“num1 = %d,num2 = %d”,num1,num2);
return 0;
}
四、赋值操作符(=)
复合赋值符
+= eg: a = a +10; -= *= /= %= >>= <<= eg: a = a<<1; &= |= ^=
a += 10; a <<= 1;
五、单目操作符
! (逻辑反操作)
- (负值)
+(正值)
&(取地址)
sizeof(操作数的类型长度<以字节为单位>)
int (2/4个字节)
short(2个字节)
long (4个字节)
long long (8个字节)
char (1个字节)
float (4个字节) 有效数字:6
double (8个字节) 15
long double (8/16个字节) 15/19
指针类型大小为4/8个字节
前言:①#include<stdio.h>
int main()
{
int arr[1] = {0}; 区别: 运行结果:
printf("%p\n",arr); 数组首元素地址 //001DFAA4
printf("%p\n",arr[0]); 数组首元素地址 //001DFAA4
printf(%p\n",&arr); 取数组地址 //001DFAA4
return 0;
}
②#include<stdio.h>
int main()
{
int arr[10]={0}; 区别: 运行结果:
printf("d\n",sizeof(arr)); 计算的是数组总大小,单位是字节 //40
printf("d\n",sizeof(arr+0)); 计算的是数组中第一个元素的大小,单位是字节 //4
return 0;
}
结论:⑴数组名单独放在sizeof内——数组总大小
⑵&数组名——取数组地址
除此之外数组名都是数组首元素地址
eg:①#include<stdio.h>
int main()
{
int a = 10; 运行结果:
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>
int main()
{
int a = 10;
short s = 2; 运行结果:
printf("%d\n",sizeof(s = a + 3)); 不运算的s的类型占2个字节 //2
printf("%d\n",s); //2
return 0;
}
~ (对一个数的二进制位按位取反)
eg:#include<stdio.h>
int main()
{
int a = 0; //000 0
printf("%d/n",~a); //111——101 -1
return 0;
}
注意:要将一个数的第n位0改为1,可或上1左移n-1位的数
要将一个数的第n位1改为0,可与上1左移n-1位后在按位取反的数
-- (前置、后置--)
++ (前置、后置++)
eg:#include<stdio.h>
int main()
{
int a = 10;
int b = a++; 后置++:先使用,后++ int b = ++a; 前置++:先++,后使用
printf("%d\n",b); //10 printf("%d\n",b); //11
printf("%d\n",a); //11 printf("%d\n",a); //11
return 0;
}
* (间接访问操作符<解引用操作符>)
(类型) (强制类型转换)
eg: (double)a (将a转换成double类型)
(int)(x+y) (将x+y的值转换成int型)
(float)(5%3) (将5%3的值转换成float型)
形式:(类型名)(表达式)
六、关系操作符 (字符串不可拿这个比)
>
>=
<
<=
!=
==
七、逻辑操作符
&& 逻辑与<两个同时为真为真>
|| 逻辑或<两个同时为假为假>
eg*
①#include<stdio.h>
int main()
{
int i = 0,a = 0,b = 2,c = 3,d = 4;
i = a++&&++b&&d++; 只有a++执行了
printf("a = %d\nb = %d\nc = %d\nd = %d\n",a,b,c,d); //1234
}
②#include<stdio.h>
int main()
{
int i = 0,a = 1,b = 2,c = 3,d = 4;
i = a++&&++b&&d++; a++、++b、d++三个都执行了
printf("a = %d\nb = %d\nc = %d\nd = %d\n",a,b,c,d); //2335
}
七、条件操作符
exp1 ? exp2 : exp3
eg: 1.if (a>5) 换为条件操作符①(a>5)? b = 3 : b = -3;
b = 3; ② b = (a>5) ? 3 : -3; 更好
else
b = -3;
2.用条件表达式实现找两个数中较大值
int a = 10;
int b = 5;
Max =(a>b)?a:b;
八、逗号表达式
exp1,exp2,exp3,.........expN 从左向右依次执行,整个表达式的结果是最后一个表达式的结果
九、下标引用、函数调用和结构成员
1.[ ] 两个操作数
2.( ) 一个或者多个操作数 一个为函数名,剩余的操作数就是传递给函数的参数
eg:①
#include<stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
int a = 10;
int b = 20;
Add (a,b);
return 0;
}
②
#include<stdio.h>
void Swap(int *px,int *py)
{
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main( )
{
int x = 0;
int y = 0;
Swap(&x,&y);
printf("x = %dy=%d\n",x,y);
return 0;
}
3.访问一个结构的成员
①结构体.成员名
②结构体指针——>成员名
运算符优先级:
! > 算术运算符 > 关系运算符 > 逻辑运算符 > 条件运算符 ?: > 赋值运算符 > 逗号运算符,