当前位置:网站首页>007 C语言基础:C运算符
007 C语言基础:C运算符
2022-06-27 04:04:00 【入狱计划进度50%】
一:概述
运算符是一种告诉编译器执行特定的数字或逻辑操作的符号。
二:分类
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
杂项运算符
三:算术运算符
下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:
| 运算符 | 描述 | 实例 |
|---|---|---|
| + | 把两个操作数相加 | A + B 将得到 30 |
| - | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 |
| * | 把两个操作数相乘 | A * B 将得到 200 |
| / | 分子除以分母 | B / A 将得到 2 |
| % | 取模运算符,整除后的余数 | B % A 将得到 0 |
| ++ | 自增运算符,整数值增加 1 | A++ 将得到 11 |
| –(两个减号) | 自减运算符,整数值减少 1 | A-- 将得到 9 |
实例:
#include <stdio.h>
int main(){
int a = 21;
int b = 10;
int 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);
c = a % b;
printf("a\%b= %d \n", c);
c = a++;
printf("c++= %d \n", c);
c = a--;
printf("c--= %d \n", c);
}
结果:
┌──(rootkali)-[~/Desktop/c_test]
└─# vim suanshu_yunsuanfu.c
┌──(rootkali)-[~/Desktop/c_test]
└─# gcc suanshu_yunsuanfu.c -o suanshu_yunsuanfu
┌──(rootkali)-[~/Desktop/c_test]
└─# ./suanshu_yunsuanfu
a+b= 31
a-b= 11
a*b= 210
a/b= 2
a%b= 1
c++= 21
c--= 22
区别:a++与++a,a++ 和 ++a的相同点都是给a+1,不同点是a++是先赋值再+1,而++a则是先+1再参赋值。
实例:
#include <stdio.h>
int main(){
int b;
int a = 10;
b = a++;
printf("b = %d \n", b);
printf("a = %d \n", a);
printf("----------- \n");
a = 10;
int c;
c = ++a;
printf("c = %d \n", c);
printf("a = %d \n", a);
}
结果:
┌──(rootkali)-[~/Desktop/c_test]
└─# vim a++a.c
┌──(rootkali)-[~/Desktop/c_test]
└─# gcc a++a.c -o a++a
┌──(rootkali)-[~/Desktop/c_test]
└─# ./a++a
b = 10
a = 11
-----------
c = 11
a = 11
四:关系运算符
| 运算符 | 描述 |
|---|---|
| == | 检查两个操作数的值是否相等,如果相等则条件为真。 |
| != | 检查两个操作数的值是否相等,如果不相等则条件为真。 |
| > | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 |
| < | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 |
| >= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 |
| <= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 |
实例:
#include <stdio.h>
int a = 22;
int b = 22;
int main(){
if (a == b){
printf("yes");
}else{
printf("no");
}
}
结果:
┌──(rootkali)-[~/Desktop/c_test]
└─# vim guanxi_yunsuanfu.c
┌──(rootkali)-[~/Desktop/c_test]
└─# gcc guanxi_yunsuanfu.c -o guanxi_yunsuanfu
┌──(rootkali)-[~/Desktop/c_test]
└─# ./guanxi_yunsuanfu
yes
五:逻辑运算符
| 运算符 | 描述 |
|---|---|
| && | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 |
| || | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 |
| ! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 |
实例:
#include <stdio.h>
int main()
{
int a = 5;
int b = 20;
int c ;
if ( a && b )
{
printf("Line 1 - 条件为真\n" );
}
if ( a || b )
{
printf("Line 2 - 条件为真\n" );
}
/* 改变 a 和 b 的值 */
a = 0;
b = 10;
if ( a && b )
{
printf("Line 3 - 条件为真\n" );
}
else
{
printf("Line 3 - 条件不为真\n" );
}
if ( !(a && b) )
{
printf("Line 4 - 条件为真\n" );
}
}
结果:
当上面的代码被编译和执行时,它会产生下列结果:
Line 1 - 条件为真
Line 2 - 条件为真
Line 3 - 条件不为真
Line 4 - 条件为真
六:位运算符
在C 语言中,位运算符主要是用于数值类型的二进制的运算。
| 运算符 | 说明 | 范例 | 运算规则 |
|---|---|---|---|
| & | 按位与 | A & B | 如果两数对应的二进制位都为 1,那么结果为 1, 否则结果为 0。 |
| | | 按位或 | A | B | 如果两数对应的二进制位有一个为 1,那么结果为 1, 否则结果为 0。 |
| ^ | 按位异或 | A ^ B | 如果两数对应的二进制位不同,那么结果为 1, 否则结果为 0。 |
| ~ | 取反运算符 | ~A | 按二进制位进行“取反”运算。 |
| << | 左移运算符 | A << 2 | 二进制左移运算符。左操作数的值向左移动右操作数指定的位数(左边的二进制位丢弃,右边补0)。 |
| >> | 右移运算符 | A >> 2 | 二进制右移运算符。左操作数的值向右移动右操作数指定的位数(正数左补0,负数左补1,右边丢弃)。 |
案例说明:
假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
A << 2 将得到 240,即为 1111 0000
A >> 2 将得到 15,即为 0000 1111
七:赋值运算符
| 运算符 | 描述 | 实例 |
|---|---|---|
| = | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C |
| += | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A |
| -= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A |
| *= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A |
| /= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A |
| %= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A |
| <<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 |
| >>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 |
| &= | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 |
| ^= | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 |
| |= | 按位或且赋值运算符 | C |= 2 等同于 C = C | 2 |
八:杂项运算符
杂项运算符一般包括,sizeof(),&,*和?:
| 运算符 | 描述 | 实例 |
|---|---|---|
| sizeof() | 返回变量的大小。 | sizeof(a) 将返回 4,其中 a 是整数。 |
| & | 返回变量的地址。 | &a; 将给出变量的实际地址。 |
| * | 指向一个变量。 | *a; 将指向一个变量。 |
| ?: | 条件表达式 | 如果条件为真 ? 则值为 X : 否则值为 Y |
实例:
#include <stdio.h>
int main(){
int a = 4;
short b;
double c;
int* ptr;
/*&和*运算符实例*/
ptr = &a; // 'ptr'现在包含'a'的地址
printf("a的地址是: %d \n", &a);
printf("a的值是: %d \n", a);
printf("*ptr的值是: %d \n", *ptr);
/*三元运算符*/
a = 10;
b = (a == 1) ? 20: 30;
printf("b的值是: %d \n", b);
a = 10;
b = (a == 10) ? 20: 30;
printf("b的值是: %d \n", b);
}
结果:
┌──(rootkali)-[~/Desktop/c_test]
└─# vim zaxiang_yunsuanfu.c
┌──(rootkali)-[~/Desktop/c_test]
└─# gcc zaxiang_yunsuanfu.c -o zaxiang_yunsuanfu
┌──(rootkali)-[~/Desktop/c_test]
└─# ./zaxiang_yunsuanfu
a的地址是: -674308176
a的值是: 4
*ptr的值是: 4
b的值是: 30
b的值是: 20
九:C中的运算符优先级
C 语言 中运算符的运算规则是,优先级高的运算符先执行,优先级低的运算符后执行,同一优先级的运算符按照从左到右的顺序进行。
需要注意的是,C 语言中大部分运算符都是从左向右执行的,只有单目运算符、赋值运算符它们是从右向左执行的。
C 语言运算符中,如果有小括号,即 (),则小括号的优先级最高。
C语言运算符优先级表
优先级 分类 运算符 结合性
1 逗号运算符 , 从左到右
2 赋值运算符 =、+=、-=、*=、/=、 %=、 >=、 <<=、&=、^=、|= 从右到左
3 逻辑或 || 从左到右
4 逻辑与 && 从左到右
5 按位或 | 从左到右
6 按位异或 ^ 从左到右
7 按位与 & 从左到右
8 相等/不等 ==、!= 从左到右
9 关系运算符 <、<=、>、>= 从左到右
10 位移运算符 <<、>> 从左到右
11 加法/减法 +、- 从左到右
12 乘法/除法/取余 *(乘号)、/、% 从左到右
13 单目运算符 !、*(指针)、& 、++、–、+(正号)、-(负号) 从右到左
14 后缀运算符 ( )、[ ]、-> 从左到右
注意:优先级值越大,表示优先级越高。
边栏推荐
- IOS development: understanding of dynamic library shared cache (dyld)
- Cultural tourism light show breaks the time and space constraints and shows the charm of night tour in the scenic spot
- ERP demand and sales management Kingdee
- 基于MobileNet-Yolov4搭建轻量化目标检测
- NestJS环境变量配置,解决如何在拦截器(interceptor)注入服务(service)的问题
- A^2=e | the solution of the equation | what exactly can this equation tell us
- 电商产品如何在知乎上进行推广和打广告?
- Description of replacement with STM32 or gd32
- windows上安装MySQL
- SAI钢笔工具如何使用,入门篇
猜你喜欢

WPF open source control library extended WPF toolkit Introduction (Classic)

快速掌握 ASP.NET 身份认证框架 Identity - 通过邮件重置密码

QChart笔记2: 添加鼠标悬停显示
![[数组]BM94 接雨水问题-较难](/img/2b/1934803060d65ea9139ec489a2c5f5.png)
[数组]BM94 接雨水问题-较难

Kotlin compose custom compositionlocalprovider compositionlocal

resnet152 辣椒病虫害图像识别1.0

2019LXMERT:Learning Cross-Modality Encoder Representations from Transformers

2021:Passage Retrieval for Outside-KnowledgeVisual Question Answering通道检索的外部知识视觉问答

2021:AdaVQA: Overcoming Language Priors with Adapted Margin Cosine Loss∗自适应的边缘余弦损失解决语言先验

敏捷开发篇--Agile Development-自用
随机推荐
如何系统学习LabVIEW?
2022-06-26:以下golang代码输出什么?A:true;B:false;C:编译错误。 package main import “fmt“ func main() { type
Kotlin Compose compositionLocalOf 与 staticCompositionLocalOf
Installation of low code development platform nocobase
Argo workflows - getting started with kubernetes' workflow engine
Installing MySQL on Windows
Penetration test - directory traversal vulnerability
733. image rendering
A^2=E | 方程的解 | 这个方程究竟能告诉我们什么
Ledrui ldr6035 usb-c interface device supports rechargeable OTG data transmission scheme.
2016Analyzing the Behavior of Visual Question Answering Models
jmeter分布式压测
[array]bm94 rainwater connection problem - difficult
Ldr6028 OTG data transmission scheme for mobile devices while charging
Fplan layout
Baidu PaddlePaddle's "universal gravitation" first stop in 2022 landed in Suzhou, comprehensively launching the SME empowerment plan
JMeter takes the result of the previous request as the parameter of the next request
Learn crypto from Buu (Zhou Geng)
2021:Passage Retrieval for Outside-KnowledgeVisual Question Answering通道检索的外部知识视觉问答
[promise I] introduction of promise and key issues of hand rolling