1.算术操作符
%
%取模(余),计算的是整除之后的余数,取模操作的两边操作数只能是整数
#include<stdio.h>
int main()
{
int num= 10 % 3;
printf("num1=%d\n", num);
return 0;
}
思考:如何随机生成一个1-100的数?
/
除号,如果操作符的两个操作数都为整数,那么就执行整数除法。如果想让结果保留小数,除号的两端至少有一个操作数是浮点数。
#include<stdio.h>
int main()
{
int num1 = 10 / 3;
double num2 = 10.0 / 3;
printf("num1=%d\n", num1);
printf("num2=%.1lf\n", num2);
return 0;
}
2.移位操作符
关于二进制
整数的二进制表示形式,分为三种(原码、反码、补码)
原码就是按照一个数的正负,直接写出它的二进制表示形式得到的就是原码,值得注意的是,原码的最高位(最前面的那一位)是符号位,0表示正数,1表示负数。正数的原码、反码、补码是相同的,而负数的反码、补码要经过计算的。
反码:符号位不变,其他位按位取反,就是反码
补码:反码+1
举例:
a=10
a的原码、反码、补码都是00000000000000000000000000001010
b=-10
b的原码10000000000000000000000000001010
b的反码11111111111111111111111111110101
b的补码11111111111111111111111111110110
参与移位的时候,移动的都是补码,printf的时候是原码
<< 左移操作符
移位规则:左边抛弃、右边补0
#include<stdio.h>
int main()
{
int num1 = 10;
int num2 = num1 << 1;
printf("num1=%d\n", num1);
printf("num2=%d\n", num2);
return 0;
}
>> 右移操作符
移位规则:
第一种:逻辑移位:左边用0填充,右边丢弃
第二种:算术移位:左边用原该值的符号位填充,右边丢弃
(大多数编译器用的都是算术移位)
#include<stdio.h>
int main()
{
int num1 = -1;
int num2 = num1 >> 1;
printf("num1=%d\n", num1);
printf("num2=%d\n", num2);
return 0;
}
注:移位操作符的操作数只能是整数,且移位操作符移的是二进制位表示形式的整数。
警告:对于移位运算符,不要移动负数位,这个是未定义的。
3.位操作符
& | ^
& 按位与-按二进制位与,对应的二进制位有0则为0,两个同时为1,才为1
| 按位或-按二进制位或,对应的二进制位有1则为1,两个同时为0,才为0
^ 按位异或 -对应的二进制位相同为0,相异为1
注:他们的操作数必须是整数。
关于^操作符
0^a=a
a^a=0
^支持交换律:a^a^b=a^b^a=b
4.赋值操作符 =
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
例如:
int x = 10;
x = x+10;
x += 10;//复合赋值
其他运算符一样的道理。这样写更加简洁。
5.单目操作符
逻辑反操作 !
#include<stdio.h>
int main()
{
int flag = 1;
if (flag)
{
printf("hehe\n");
}
if (!flag)
{
printf("haha\n");
}
return 0;
}
取地址 & 和间接访问操作符 *
#include<stdio.h>
int main()
{
int a = 10;
int* pa = &a;
*pa = 20;//解引用操作
printf("%d\n", a);
return 0;
}
操作数的类型长度 sizeof
int main()
{
int a-=0;
printf("%d\n",sizeof(a));//a的括号可以省略
printf("%d\n",sizeofa); //ok
printf("%d\n",sizeof(int));//int的括号不能省略
int arr[10]={0};
printf("%d\n",sizeof(arr));
printf("%d\n",sizeof arr); //ok
printf("%d\n",sizeof(int[10]));//ok
return 0;
}
函数调用的时候,要写(),但是sizeof后边的括号可以省略,说明sizeof不是函数,是操作符
按位取反 ~
#include<stdio.h>
int main()
{
int a = 0;
printf("%d\n", ~a);
return 0;
}
(类型)强制类型转换
#include<stdio.h>
int main()
{
int a = (int)3.14;
printf("%d\n", a);
return 0;
}
++ --
前置
#include<stdio.h>
int main()
{
int a = 10;
int b = ++a;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
前置++:先++,再使用,相当于a=a+1;b=a
后置
#include<stdio.h>
int main()
{
int a = 10;
int b = a++;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
后置++:先使用,再++,相当于int b=a;a=a+1
6.关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
这些关系运算符比较简单,但是我们要注意一些运算符使用时候的陷阱。
警告: 在编程的过程中== 和=不小心写错,导致的错误。
7. 逻辑操作符
逻辑操作符有哪些:
&& 逻辑与
|| 逻辑或
区分逻辑与和按位与,区分逻辑或和按位或
按位与和按位或是通过二进制计算的,逻辑与和逻辑或只关注真和假
a | b | a&&b |
---|---|---|
真 | 真 | 真 |
假 | 真 | 假 |
真 | 假 | 假 |
假 | 假 | 假 |
a | b | a||b |
---|---|---|
真 | 真 | 真 |
假 | 真 | 真 |
真 | 假 | 真 |
假 | 假 | 假 |
8.条件操作符
也叫三目操作符
exp1 ? exp2 : exp3
如果表达式1为真,则计算表达式2的值,表达式2的结果就是整个表达式的结果
如果表达式2为假,则计算表达式3的值,表达式3的结果就是整个表达式的结果
9.逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
10. 下标引用、函数调用和结构成员
[ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
#include<stdio.h>
int main()
{
int arr[10];
arr[9] = 10;
printf("%d\n", arr[9]);
return 0;
}
( ) 函数调用操作符
#include<stdio.h>
#include<string.h>
int main()
{
int len = strlen("abcdef");
printf("%d\n", len);
return 0;
}
( )就是函数调用操作符,操作数:strlen,"abcdef"
访问一个结构的成员
. 结构体.成员名
#include<stdio.h>
struct Book
{
char name[20];
char author[30];
int price;
};
int main()
{
struct Book b1 = { "红楼梦","曹雪芹",128};
struct Book b2 = { "西游记","吴承恩",168};
printf("《%s》 %s %d\n", b1.name, b1.author,b1.price);
printf("《%s》 %s %d\n", b2.name, b2.author,b2.price);
return 0;
}
-> 结构体指针->成员名
#include<stdio.h>
struct Book
{
char name[20];
char author[30];
int price;
};
void print(struct Book* p)
{
printf("《%s》 %s %d\n", p->name, p->author, p->price);
//结构体指针->成员名
}
int main()
{
struct Book b1 = { "红楼梦","曹雪芹",128};
struct Book b2 = { "西游记","吴承恩",168};
print(&b1);
print(&b2);
return 0;
}
也可以写成
#include<stdio.h>
struct Book
{
char name[20];
char author[30];
int price;
};
void print(struct Book* p)
{
printf("《%s》 %s %d\n", (*p).name, (*p).author, (*p).price);
}
int main()
{
struct Book b1 = { "红楼梦","曹雪芹",128};
struct Book b2 = { "西游记","吴承恩",168};
print(&b1);
print(&b2);
return 0;
}