在C语言中,运算符是用来执行各种数学和逻辑操作的符号。它们可以用于算术运算、关系比较、逻辑判断等方面。本文将介绍C语言中常见的运算符及其用法。结尾附有运算符优先级表。
目录
1. 算术运算符
算术运算符用于执行基本的数学运算,如加、减、乘、除和取余。常见的算术运算符包括:
- 加法运算符(+):执行两个操作数的相加操作。
- 减法运算符(-):执行两个操作数的相减操作。
- 乘法运算符(*):执行两个操作数的相乘操作。
- 除法运算符(/):执行两个操作数的相除操作。
- 取余运算符(%):计算两个操作数的余数。
以下是算术运算符的一些示例代码:
#include <stdio.h>
int main() {
int a = 10;
int b = 3;
int c = 0;
c = a + b; // 加法运算
printf("a + b = %d\n", c);
c = a - b; // 减法运算
printf("a - b = %d\n", c);
c = a * b; // 乘法运算
printf("a * b = %d\n", c);
c = a / b; // 除法运算
printf("a / b = %d\n", c);
c = a % b; // 取余运算
printf("a %% b = %d\n", c);
return 0;
}
注意:
除号运算符:/
分母不能为0;分母为0,会报语法错误,也可能程序会直接崩溃!!!
相除结果只能保留整数部分;例如结果为3.3,实际保留结果为3
#include<stdio.h>
int main()
{
int a=10;
int b=3;
int c=0;
c=a/b;//除号运算,只能保留结果得整数部分;被除数b不能为0
printf("a/b=%d\n",c);
return 0;
}
2. 关系运算符
关系运算符用于比较两个值之间的关系,返回的结果是真(非零)或假(零)。常见的关系运算符包括:
- 大于运算符(>):判断左操作数是否大于右操作数。
- 大于等于运算符(>=):判断左操作数是否大于或等于右操作数。
- 小于运算符(<):判断左操作数是否小于右操作数。
- 小于等于运算符(<=):判断左操作数是否小于或等于右操作数。
- 等于运算符(==):判断两个操作数是否相等。
- 不等于运算符(!=):判断两个操作数是否不相等。
以下是关系运算符的示例代码:
#include <stdio.h>
int main() {
int a = 10;
int b = 5;
if (a > b) {
printf("a > b\n");
}
if (a >= b) {
printf("a >= b\n");
}
if (a < b) {
printf("a < b\n");
}
if (a <= b) {
printf("a <= b\n");
}
if (a == b) {
printf("a == b\n");
}
if (a != b) {
printf("a != b\n");
}
return 0;
}
3.逻辑运算符
逻辑运算符用于进行逻辑判断,结果为真(非零)或假(零)。常见的逻辑运算符包括:
- 与运算符(&&):当两个操作数都为真时,结果为真。
- 或运算符(||):当两个操作数中至少有一个为真时,结果为真。
- 非运算符(!):对操作数取反,如果操作数为真,则结果为假;如果操作数为假,则结果为真。
注意1:
&&:(表达式1)&&(表达式2)
表达式1和表达式2都为真,则为逻辑真
表达式1和表达式2有一个为假,或者全部为假,则为逻辑假
注意:当表达式1为假时,表达式2不再执行判断(表达式2语句不执行)。
#include<stdio.h>
int main()
{
int a=10;
int b=3;
if((a<b)&&(b=a+b))//(a<b)为假,b=a+b不再执行
{
printf("hello zaizai!\n");
}
printf("a=%d,b=%d\n",a,b);
if((a>b)&&(b=a+b))//(a>b)为真,b=a+b执行
{
printf("hello zaizai\n");
}
printf("a=%d,b=%d\n",a,b);
return 0;
}
注意2:
||:(表达式1)||(表达式2)
表达式1和表达式2有一个为真,则为逻辑真
表达式1和表达式2全为假,则为逻辑假
注意:当表达式1为真时,表达式2不再执行判断(表达式2语句不执行)。
#include<stdio.h>
int main()
{
int a=10;
int b=3;
if((a<b)||(b=a+b))//(a<b)为假,b=a+b执行
{
printf("hello zaizai!\n");
}
printf("a=%d,b=%d\n",a,b);
if((a)||(b=a+b))//(a)为真,b=a+b不再执行
{
printf("hello zaizai\n");
}
printf("a=%d,b=%d\n",a,b);
return 0;
}
4.位运算符
位运算符用于对二进制位进行操作。常见的位运算符包括:
- 按位与运算符(&):执行按位与操作。
- 按位或运算符(|):执行按位或操作。
- 按位异或运算符(^):执行按位异或操作。
- 按位取反运算符(~):执行按位取反操作。
- 左移运算符(<<):将一个数的二进制位向左移动指定的位数。
- 右移运算符(>>):将一个数的二进制位向右移动指定的位数。
位运算符通常用于对二进制数据进行处理,对于普通的数学运算并不常用。(感兴趣的话可以阅读我的另一篇关于位运算符大全的博客)。
5.(复合)赋值运算符
=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
赋值运算符:=
- 单个等号(=)在c语言中是赋值运算;
- 算术运算符复合赋值:+=、-=、*=、/=、%=
- 位运算符复合赋值:&=、|=、^=、<<=、>>=
#include <stdio.h>
int main() {
int a = 10;
int b = 5;
a += b; // 等价于 a = a + b;
printf("a = %d\n", a);
a -= b; // 等价于 a = a - b;
printf("a = %d\n", a);
a *= b; // 等价于 a = a * b;
printf("a = %d\n", a);
a /= b; // 等价于 a = a / b;
printf("a = %d\n", a);
a %= b; // 等价于 a = a % b;
printf("a = %d\n", a);
return 0;
}
6. 其他运算符
除了上述常见的运算符外,C语言还有一些特殊的运算符:
- sizeof运算符:用于获取变量或数据类型的字节大小。
- 三目/条件运算符:用于根据条件选择不同的表达式进行赋值。
- 逗号运算符:用于在一条语句中依次执行多个表达式,并返回最后一个表达式的值。
- 下标运算符([]):用于访问数组中的元素。
- 取地址运算符(&):用于获取变量的内存地址。
- 地址引用运算符(*):用于通过指针访问所指向的变量。
- 结构体/共用体成员访问运算符(.):用于访问结构体或共用体中的成员。
- 结构体/共用体指针成员访问运算符(->):用于通过指针访问结构体或共用体中的成员。
- 小括号运算符(()):用于控制运算的优先级和改变运算的顺序。
- 强制类型转换运算符:用于将一个数据类型强制转换为另一个数据类型。
sizeof运算符:
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
printf("数组的大小为:%d\n", size);
return 0;
}
三目/条件运算符:
#include <stdio.h>
int main() {
int a = 10;
int b = 5;
int max = (a > b) ? a : b;
printf("较大的数是:%d\n", max);
return 0;
}
逗号运算符:
#include <stdio.h>
int main() {
int a = 5, b = 10, c = 15;
int max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
printf("最大的数是:%d\n", max);
return 0;
}
下标运算符:
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int index = 2;
int value = arr[index];
printf("数组中下标为 %d 的元素是:%d\n", index, value);
return 0;
}
取地址运算符(&)和地址引用运算符(*):
#include <stdio.h>
int main() {
int a = 10;
int *ptr = &a;
printf("变量 a 的值为:%d\n", a);
printf("变量 a 的地址为:%p\n", &a);
printf("指针 ptr 的值为:%p\n", ptr);
printf("指针 ptr 指向的值为:%d\n", *ptr);
return 0;
}
结构体/共用体成员访问运算符(.)和结构体/共用体指针成员访问运算符(->):
#include <stdio.h>
struct Point {
int x;
int y;
};
int main() {
struct Point p1 = {3, 4};
struct Point *ptr = &p1;
printf("p1 的 x 坐标为:%d\n", p1.x);
printf("p1 的 y 坐标为:%d\n", p1.y);
printf("指针 ptr 指向的结构体的 x 坐标为:%d\n", ptr->x);
printf("指针 ptr 指向的结构体的 y 坐标为:%d\n", ptr->y);
return 0;
}
强制类型转换运算符:
#include <stdio.h>
int main() {
int a = 10;
double b = 3.14;
int result = (int)b / a;
printf("强制类型转换的结果为:%d\n", result);
return 0;
}
三、总结
运算符虽然不少,而且还有优先级之分,但是多练习熟悉就好了,实践出真知!
附录:运算符优先级表
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[长度] | 从左往右 | |
() | 小括号 | (表达式)或 函数名(形参表) | |||
. | 取成员 | 结构体名.成员 | |||
-> | 指针 | 结构体指针->成员 | |||
2 | - | 负号运算符 | -表达式 | 从右往左 | 单目运算符 |
() | 强制类型转换 | (数据类型)表达式 | |||
++ | 自增运算符 | ++变量或变量++ | 单目运算符 | ||
-- | 自减运算符 | --变量或变量-- | 单目运算符 | ||
* | 取内容 | *指针变量 | 单目运算符 | ||
& | 取地址 | &变量名 | 单目运算符 | ||
! | 逻辑非 | !表达式 | 单目运算符 | ||
~ | 按位取反 | ~整型表达式 | 单目运算符 | ||
sizeof | 求长度 | sizeof(表达式) | 单目运算符 | ||
3 | / | 除 | 表达式 / 表达式 | 从左往右 | 双目运算符 |
* | 乘 | 表达式 * 表达式 | 双目运算符 | ||
% | 取余 | 表达式 / 表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 从左往右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 变量<<表达式 | 从左往右 | 双目运算符 |
>> | 右移 | 变量<<表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 从左往右 | 双目运算符 |
>= | 大于或等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于或等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 从左往右 | 双目运算符 |
!= | 不等于 | 表达式!=表达式 | 双目运算符 | ||
8 | & | 按位与 | 表达式&表达式 | 从左往右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 从左往右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 从左往右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 从左往右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 从左往右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 从右往左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 从右往左 | 双目运算符 |
/= | 除后再赋值 | 变量/=表达式 | |||
*= | 乘后再赋值 | 变量*=表达式 | |||
%= | 取余后再赋值 | 变量%=表达式 | |||
+= | 加后再赋值 | 变量+=表达式 | |||
-= | 减后再赋值 | 变量-=表达式 | |||
<<= | 左移再赋值 | 变量<<=表达式 | |||
>>= | 右移再赋值 | 变量>>=表达式 | |||
&= | 按位与再赋值 | 变量&=表达式 | |||
^= | 按位异或再赋值 | 变量^=表达式 | |||
|= | 按位或再赋值 | 变量|=表达式 | |||
15 | , | 逗号表达式 | 表达式,表达式,… | 从左往右 |