操作符

算术运算符

加(+) 减(-) 乘(*) 除(/) 取余(%)

注意:

  • %(取余) 两个操作数 必须整数,而其他的几个操作符整数、浮点数都可。
  • /(除法) 操作符如果两个操作数都为整数,结果取整数。而只要有浮点数在运算符两边,结果就为浮点数。
1
2
3
4
5
6
7
8
9
int main()
{
int a = 5 / 2;
printf("%d\n", a);
double b = 5 / 2.0;
printf("%lf\n", b);
int c = 5 % 2;
printf("%d\n", c);
}

移位操作符

<< 左移操作符 左边抛弃、右边补0

>> 右移操作符

注意:移位操作符的操作数 只能是 正整数

1
2
3
4
5
6
7
int main()
{
int a = -1;
int b = a >> 1;
printf("%d",b);
return 0;
}

位操作符

按位与运算(& ):两个1结果才为1,否则就是0。

按位或运算(|):只要有一个是1,就为1,两个0为0。

按位异或运算(^):相同为0,相异为1。(同假异真)

注意:操作数 只能是 整数

赋值操作符

连续赋值:执行顺序 从右到左 a=x=y+1 —> x=y+1 a=x

复合赋值:+= -= *= /= %= >>= <<= &= |= ^=

单目操作符

只有一个操作数

!: 逻辑反操作

-: 负值

+: 正值

&: 取地址

sizeof: 计算变量所占内存空间的大小(以字节为单位) sizeof是操作符,不是函数。

~: 对一个数的二进制按位取反

—: 前置、后置—

++: 前置、后置++

*: 间接访问操作符(解引用操作符)

(类型) : 强制类型转换

1
2
3
4
5
6
7
8
int main()
{
int a = 10;
int b = 10;
printf("%d\n", ++a); //11 先++,后使用
printf("%d\n", b++); //10 先使用,后++
return 0;
}

注意:多个i++相加(不同的编译器,答案不同),但是我遇到的题目答案都是统一的(也就是visual studio)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
int i=0;
int s = ++i + ++i + ++i;
}
// 题目答案是:9,不同编译器答案不同,有争议。

int main()
{
int i, j, a, b;
i = 7, j = 9;
a = ++i + i++;
b = ++j + ++j;
printf("%d %d %d %d", i, j, a, b);

return 0;
}
//9 11 16 22
可以这么记:前置++比后置++优先算,后置++值等于原本值

答案不唯一

image-20230617205412567

关系操作符

!= == > < >= <=

关系操作符返回 1(真) 或 0(假)

注意:判断相等用==,不是=

逻辑操作符

&& 逻辑与

|| 逻辑或

注意:

  • &&遇到一个为假,就停止(短路)
  • ||遇到第一个为真,就停止(断路)
  • &&的优先级高于||
1
2
3
4
5
区分逻辑与和按位与 区分逻辑或和按位或
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}

条件操作符

exp1 ? exp2 : exp3

它可替换if…else

条件操作符又叫 三目操作符

可以给三目操作符进行赋值,成立的那个表达式的结果就是该变量的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
int a = 10;
int b = 20;
int max = 0;
//if (a > b) {
// max = a;
//}
//else {
// max = b;
//}
max = a > b ? a : b;
printf("%d\n", max);
return 0;
}

逗号表达式

exp1, exp2, exp3, …expN

逗号表达式,就是用逗号隔开的多个表达式。

逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

1
2
3
4
5
6
7
8
int main()
{
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);
printf("%d\n",c); //13
return 0;
}

下标引用、函数调用和结构成员

1. [ ] 下标引用操作符

1
2
3
int arr[10];  //创建数组
arr[9] = 10; //实用下标引用操作符。
// [ ]的两个操作数是arr和9。

2. ( ) 函数调用操作符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); //实用()作为函数调用操作符。
test2("hello bit.");//实用()作为函数调用操作符。
return 0;
}

3. 访问一个结构的成员

. 结构体.成员名

-> 结构体指针->成员名

运算符优先级

查看图片测试

运算符优先级.jpg

运算符结合律

如果一个表达式中的两个操作数具有相同的优先级,那么它们的结合律。决定它们的组合方式是从左到右或是从右到左。

C语言运算符优先级 (biancheng.net)