系列文章目录
【C语言】函数
【C语言】选择语句和循环语句
【C语言数据类型,变量和常量】
【C语言】整形和浮点型在内存中的存储
【C语言】数组
文章目录
一、操作符分类
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
二
1.算数操作符
+ - * / %
‘+’,‘-’,'*'和日常使用的逻辑一致,操作数可以是整形和浮点型;
C语言中的除法分为整数除法和浮点数除法;
1.当除法操作符两边的操作数都是整型类型时,执行的是整型除法;
2.当除法操作符两边的操作数有一个是浮点数时,会执行浮点数除法;
#include <stdio.h>
int main()
{
int x = 5;
int y = 2;
double z = x / y;
printf("%lf\n", z); // 2.000000
z = x * 1.0 / y;
printf("%lf\n", z);//2.500000
z = (double)x / y;
printf("%lf\n", z);//2.500000
return 0;
}
要注意的是,‘%’操作符的两个操作数必须是整形,返回的是余数;
2.移位操作数
<<左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。
左移和右移操作符操作的是二进制位;
#include <stdio.h>
int main()
{
int n = 10;
0000 0000 0000 0000 0000 0000 0000 1010 --补码(正整数的原码,反码,补码相同)
n = n << 1;
0000 0000 0000 0000 0000 0000 0001 0100 -- 20
左移操作符:左边抛弃、右边补0
printf("%d", n);
return 0;
}
右移有两种方式:
逻辑移位:左边用0填充,右边丢弃
算术移位:左边用原该值的符号位填充,右边丢弃
#include <stdio.h>
int main()
{
int n = -10;
1000 0000 0000 0000 0000 0000 0000 1010 --原码
1111 1111 1111 1111 1111 1111 1111 0101 --反码
1111 1111 1111 1111 1111 1111 1111 0110 --补码
n = n >> 1;
逻辑右移:
0111 1111 1111 1111 1111 1111 1111 1011 -- 一个很大的正数 2^31-1-4
算数右移:
1111 1111 1111 1111 1111 1111 1111 1011 -- -5
printf("%d", n);
return 0;
}
由此可以确定,在我的编译器下,右移执行的是算数右移;
3.位操作数
& 按位与
| 按位或
^ 按位异或
注:他们的操作数也必须是整数;
&:如果两个操作数对应二进制位都为1才为1,否则就是0
#include <stdio.h>
int main()
{
int a = -1;
1111 1111 1111 1111 1111 1111 1111 1111
int b = 10;
0000 0000 0000 0000 0000 0000 0000 1010
int c = a & b;
1111 1111 1111 1111 1111 1111 1111 1111
0000 0000 0000 0000 0000 0000 0000 1010
0000 0000 0000 0000 0000 0000 0000 1010 --10
对应二进制位都为1才为1,否则就是0
printf("%d", c);
return 0;
}
|:如果两个操作数对应二进制位有一个1则为1,全是0才为0
#include <stdio.h>
int main()
{
int a = -1;
1111 1111 1111 1111 1111 1111 1111 1111
int b = 10;
0000 0000 0000 0000 0000 0000 0000 1010
int c = a | b;
1111 1111 1111 1111 1111 1111 1111 1111
0000 0000 0000 0000 0000 0000 0000 1010
1111 1111 1111 1111 1111 1111 1111 1111 -- -1
对应二进制位有一个1则为1,全是0才为0
printf("%d", c);
return 0;
}
^:如果两个操作数对应二进制位不同则为1,相同为0
#include <stdio.h>
int main()
{
int a = -1;
1111 1111 1111 1111 1111 1111 1111 1111
int b = 10;
0000 0000 0000 0000 0000 0000 0000 1010
int c = a ^ b;
1111 1111 1111 1111 1111 1111 1111 1111
0000 0000 0000 0000 0000 0000 0000 1010
1111 1111 1111 1111 1111 1111 1111 0101 -- -11
对应二进制位相同为0,不同则为1
printf("%d", c);
return 0;
}
4.赋值操作数
= += -= *= /= %= &= |= ^= <<= >>=
赋值操作符是一个经常使用的操作符,要注意‘=’是赋值,‘==’是判断是否相等
;
复合赋值操作符可以简化代码,提高代码可读性;
#include <stdio.h>
int main()
{
int a = 0;
a += 2;
a *= 3;
a /= 5;
....
return 0;
}
5.单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
– 前置、后置–
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
! 逻辑反操作
#include <stdio.h>
int main()
{
int flag = 0;
C语言中,0为假,非0为真
if (flag)
{
printf("hehe");
}
if (!flag)
{
printf("haha");
}
return 0;
}
当然如果你想使用bool值来测试的话,也是可以的;C语言要使用bool值,要引一个头文件stdbool.h
;
‘+’和‘-’用来表示正负数,这个就不多说了;
& 取地址
#include <stdio.h>
int main()
{
int a = 0;
int* p = &a;
printf("%p\n", p);
return 0;
}
sizeof是一个操作符,不是函数,因为sizeof的圆括号在一些情况下可以省略,而函数的圆括号不能省略
int main()
{
int a = 0;
printf("%d", sizeof a);
return 0;
}
~ 按位取反操作符,在使用时会把符号位也取反,不要和反码搞混;
前置++,是先++,后使用,表达式的值是++之后的值;
后置++,是先使用,后++,表达式的值是++之前的值;
同理前置–和后置–也一样;
* 解引用操作符
#include <stdio.h>
int main()
{
int n = 0;
int* p = &n;
printf("%d", n);
*p = 20;
通过指针p,解引用修改n;
printf("%d", n);
return 0;
}
()强制类型转换
#include <stdio.h>
int main()
{
double x = 12.3456;
printf("%d", (int)x);
//12
return 0;
}
6.关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
注意关系操作符(==),不要在使用时写成赋值操作符(=)
7.逻辑操作符
&& 逻辑与
|| 逻辑或
逻辑与要求表达式两边都为真,才为真,如果左边操作数为假,那右边的操作数就不会再看了,因为只要有一个为假,整体表达式就为假;
逻辑或要求表达式两边至少一个为真才为真,如果左边为真,那右边的操作数就不会看了,因为只要有一个为真,整体表达式就为真;
8.条件操作符(三目操作符)
exp1 ? exp2 : exp3
如果表达式1成立,执行表达式2,表达式3不执行;如果表达式1不成立,执行表达式3,表达式2不执行;
#include <stdio.h>
用三目操作符求两数的较大值
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int max = a > b ? a : b;
printf("max");
return 0;
}
9.逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
10.下标引用、函数调用和结构成员
[] : 下标访问操作符
int main()
{
int arr[10] = { 0 };
for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
{
arr[i] = i;
[]的两个操作数是arr和i
}
return 0;
}
( ) 函数调用操作符
#include <stdio.h>
int GetMid(int x, int y)
{
return (x > y ? x : y);
}
int main()
{
int a = 0, b = 0;
scanf("%d %d", &a, &b);
printf("%d", GetMax(a, b));
return 0;
}
. 结构体.成员名
-> 结构体指针->成员名
#include <stdio.h>
typedef struct PeopleInfo
{
char name[20];
int age;
char sex[5];
}PIF;
int main()
{
PIF p = {"zhangsan", 20, "男"};
PIF* pf = &p;
printf("%s %d %s\n", p.name, p.age, p.sex);
printf("%s %d %s\n", pf->name, pf->age, pf->sex);
}
总结
好了,以上就是今天所讲的内容,如果对你有帮助,请点个赞吧。