c语言——运算符

一.运算符的简介

1.运算符的定义:运算符就是在c语言中程序执行运算的逻辑符号。

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

--

()

圆括号

(表达式)/函数名(形参表)

--

.

成员选择(对象)

对象.成员名

--

->

成员选择(指针)

对象指针->成员名

--

2

-

负号运算符

-表达式

右到左

单目运算符

~

按位取反运算符

~表达式

++

自增运算符

++变量名/变量名++

--

自减运算符

--变量名/变量名--

*

取值运算符

*指针变量

&

取地址运算符

&变量名

!

逻辑非运算符

!表达式

(类型)

强制类型转换

(数据类型)表达式

--

sizeof

长度运算符

sizeof(表达式)

--

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

%

余数(取模)

整型表达式%整型表达式

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

5

<< 

左移

变量<<表达式

左到右

双目运算符

>> 

右移

变量>>表达式

6

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

小于

表达式<表达式

<=

小于等于

表达式<=表达式

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

表达式1?

表达式2: 表达式3

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

--

/=

除后赋值

变量/=表达式

--

*=

乘后赋值

变量*=表达式

--

%=

取模后赋值

变量%=表达式

--

+=

加后赋值

变量+=表达式

--

-=

减后赋值

变量-=表达式

--

<<=

左移后赋值

变量<<=表达式

--

>>=

右移后赋值

变量>>=表达式

--

&=

按位与后赋值

变量&=表达式

--

^=

按位异或后赋值

变量^=表达式

--

|=

按位或后赋值

变量|=表达式

--

15

逗号运算符

表达式,表达式,…

左到右

--

二. 运算的分类

  • 按照功能划分:
    • 算术运算符
    • 赋值运算符
    • 关系运算符
    • 逻辑运算符
    • 位运算符
  • 按照参与运算的操作数个数划分:
    • 单目运算
      • 只有一个操作数 如 : i++;
    • 双目运算
      • 有两个操作数 如 : a + b;
    • 三目运算
      • C语言中唯一的一个,也称为问号表达式 如: a>b ? 1 : 0;

算数运算符

优先级名称符号说明
3乘法运算符*双目运算符,具有左结合性
3除法运算符/双目运算符,具有左结合性
3求余运算符 (模运算符)%双目运算符,具有左结合性
4加法运算符+双目运算符,具有左结合性
4减法运算符-双目运算符,具有左结合性

赋值运算符

优先级名称符号说明
14赋值运算符=双目运算符,具有右结合性
14除后赋值运算符/=双目运算符,具有右结合性
14乘后赋值运算符 (模运算符)*=双目运算符,具有右结合性
14取模后赋值运算符%=双目运算符,具有右结合性
14加后赋值运算符+=双目运算符,具有右结合性
14减后赋值运算符-=双目运算符,具有右结合性
#include <stdio.h>
int main(){// 简单的赋值运算符 =// 会将=右边的值赋值给左边int a = 10;printf("a = %i\n", a); // 10
}#include <stdio.h>
int main(){// 复合赋值运算符 += -= *= /= %=// 将变量中的值取出之后进行对应的操作, 操作完毕之后再重新赋值给变量int num1 = 10;// num1 = num1 + 1; num1 = 10 + 1; num1 = 11;num1 += 1;printf("num1 = %i\n", num1); // 11int num2 = 10;// num2 = num2 - 1; num2 = 10 - 1; num2 = 9;num2 -= 1;printf("num2 = %i\n", num2); // 9int num3 = 10;// num3 = num3 * 2; num3 = 10 * 2; num3 = 20;num3 *= 2;printf("num3 = %i\n", num3); // 20int num4 = 10;// num4 = num4 / 2; num4 = 10 / 2; num4 = 5;num4 /= 2;printf("num4 = %i\n", num4); // 5int num5 = 10;// num5 = num5 % 3; num5 = 10 % 3; num5 = 1;num5 %= 3;printf("num5 = %i\n", num5); // 1
}#include <stdio.h>
int main(){int number = 10;// 赋值运算符优先级是14, 普通运算符优先级是3和4, 所以先计算普通运算符// 普通运算符中乘法优先级是3, 加法是4, 所以先计算乘法// number += 1 + 25; number += 26; number = number + 26; number = 36;number += 1 + 5 * 5;printf("number = %i\n", number); // 36
}

自增自减运算符

优先级名称符号说明
2自增运算符(在后)i++单目运算符,具有左结合性
2自增运算符(在前)++i单目运算符,具有右结合性
2自减运算符(在后)i–单目运算符,具有左结合性
2自减运算符(在前)–i单目运算符,具有右结合性

sizeof运算符

  • sizeof可以用来计算一个变量或常量、数据类型所占的内存字节数

    • 标准格式: sizeof(常量 or 变量);
  • sizeof的几种形式

    • sizeof( 变量\常量 );
      • sizeof(10);
      • char c = 'a'; sizeof(c);
    • sizeof 变量\常量;
      • sizeof 10;
      • char c = 'a'; sizeof c;
    • sizeof( 数据类型);
      • sizeof(float);
      • 如果是数据类型不能省略括号
#include <stdio.h>
int main(){int a = 10;double b = 3.14;// 由于sizeof的优先级比+号高, 所以会先计算sizeof(a);// a是int类型, 所以占4个字节得到结果4// 然后再利用计算结果和b相加, 4 + 3.14 = 7.14double res = sizeof a+b;printf("res = %lf\n", res); // 7.14
}

数组长度的计算方法

  • 因为数组在内存中占用的字节数取决于其存储的数据类型和数据的个数
    • 数组所占用存储空间 = 一个元素所占用存储空间 * 元素个数(数组长度)
  • 所以计算数组长度可以使用如下方法
    数组的长度 = 数组占用的总字节数 / 数组元素占用的字节数
    int ages[4] = {19, 22, 33, 13};int length =  sizeof(ages)/sizeof(int);printf("length = %d", length);
输出结果: 4

逗号运算符

  • 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把多个表达式连接起来组成一个表达式,称为逗号表达式
  • 逗号运算符会从左至右依次取出每个表达式的值, 最后整个逗号表达式的值等于最后一个表达式的值
  • 格式: 表达式1,表达式2,… …,表达式n;
    • 例如: int result = a+1,b=3*4;
#include <stdio.h>
int main(){int a = 10, b = 20, c;// ()优先级高于逗号运算符和赋值运算符, 所以先计算()中的内容// c = (11, 21);// ()中是一个逗号表达式, 结果是最后一个表达式的值, 所以计算结果为21// 将逗号表达式的结果赋值给c, 所以c的结果是21c = (a + 1, b + 1);printf("c = %i\n", c); // 21
}

关系运算符

  • 关系运算符的运算结果只有2种:如果条件成立,结果就为1,也就是“真”;如果条件不成立,结果就为0,也就是“假”
优先级名称符号说明
6大于运算符>双目运算符,具有左结合性
6小于运算符<双目运算符,具有左结合性
6大于等于运算符>=双目运算符,具有左结合性
6小于等于运算符<=双目运算符,具有左结合性
7等于运算符==双目运算符,具有左结合性
7不等于运算符!=双目运算符,具有左结合性
#include <stdio.h>
int main(){int result = 10 > 5;printf("result = %i\n", result); // 1result = 5 < 10;printf("result = %i\n", result); // 1result = 5 > 10;printf("result = %i\n", result); // 0result = 10 >= 10;printf("result = %i\n", result); // 1result = 10 <= 10;printf("result = %i\n", result); // 1result = 10 == 10;printf("result = %i\n", result); // 1result = 10 != 9;printf("result = %i\n", result); // 1
}#include <stdio.h>
int main(){// == 优先级 小于 >, 所以先计算>// result = 10 == 1; result = 0;int result = 10 == 5 > 3;printf("result = %i\n", result); // 0
}#include <stdio.h>
int main(){// == 和 != 优先级一样, 所以按照结合性// 关系运算符是左结合性, 所以从左至右计算// result = 0 != 3; result = 1;int result = 10 == 5 != 3;printf("result = %i\n", result); // 1
}

逻辑运算符

优先级名称符号说明
2逻辑非运算符!单目运算符,具有右结合性
11逻辑与运算符&&双目运算符,具有左结合性
12逻辑或运算符\|\|双目运算符,具有左结合性
  • 逻辑非
    • 格式: ! 条件A;
    • 运算结果: 真变假,假变真
    • 运算过程:
      • 先判断条件A是否成立,如果添加A成立, 那么结果就为0,即“假”;
      • 如果条件A不成立,结果就为1,即“真”
    • 使用注意:
      • 可以多次连续使用逻辑非运算符
      • !!!0;相当于(!(!(!0)));最终结果为1
#include <stdio.h>
int main(){// ()优先级高, 先计算()里面的内容// 10==10为真, 所以result = !(1);// !代表真变假, 假变真,所以结果是假0int result = !(10 == 10);printf("result = %i\n", result); // 0
}
  • 逻辑与
    • 格式: 条件A && 条件B;
    • 运算结果:一假则假
    • 运算过程:
      • 总是先判断"条件A"是否成立
      • 如果"条件A"成立,接着再判断"条件B"是否成立, 如果"条件B"也成立,结果就为1,即“真”
      • 如果"条件A"成立,"条件B"不成立,结果就为0,即“假”
      • 如果"条件A"不成立,不会再去判断"条件B"是否成立, 因为逻辑与只要一个不为真结果都不为真
    • 使用注意:
      • "条件A"为假, "条件B"不会被执行
#include <stdio.h>
int main(){//               真     &&    真int result = (10 == 10) && (5 != 1);printf("result = %i\n", result); // 1//          假     &&    真result = (10 == 9) && (5 != 1);printf("result = %i\n", result); // 0//          真     &&    假result = (10 == 10) && (5 != 5);printf("result = %i\n", result); // 0//          假     &&    假result = (10 == 9) && (5 != 5);printf("result = %i\n", result); // 0
}#include <stdio.h>
int main(){int a = 10;int b = 20;// 逻辑与, 前面为假, 不会继续执行后面int result = (a == 9) && (++b);printf("result = %i\n", result); // 1printf("b = %i\n", b); // 20
}
  • 逻辑或
    • 格式: 条件A || 条件B;
    • 运算结果:一真则真
    • 运算过程:
      • 总是先判断"条件A"是否成立
      • 如果"条件A"不成立,接着再判断"条件B"是否成立, 如果"条件B"成立,结果就为1,即“真”
      • 如果"条件A"不成立,"条件B"也不成立成立, 结果就为0,即“假”
      • 如果"条件A"成立, 不会再去判断"条件B"是否成立, 因为逻辑或只要一个为真结果都为真
    • 使用注意:
      • "条件A"为真, "条件B"不会被执行
#include <stdio.h>
int main(){//               真     ||    真int result = (10 == 10) || (5 != 1);printf("result = %i\n", result); // 1//          假     ||    真result = (10 == 9) || (5 != 1);printf("result = %i\n", result); // 1//          真     ||    假result = (10 == 10) || (5 != 5);printf("result = %i\n", result); // 1//          假     ||    假result = (10 == 9) || (5 != 5);printf("result = %i\n", result); // 0
}#include <stdio.h>
int main(){int a = 10;int b = 20;// 逻辑或, 前面为真, 不会继续执行后面int result = (a == 10) || (++b);printf("result = %i\n", result); // 1printf("b = %i\n", b); // 20
}

三目运算符

  • 三目运算符,它需要3个数据或表达式构成条件表达式

  • 格式: 表达式1?表达式2(结果A):表达式3(结果B)

    • 示例: 考试及格 ? 及格 : 不及格;
  • 求值规则:

    • 如果"表达式1"为真,三目运算符的运算结果为"表达式2"的值(结果A),否则为"表达式3"的值(结果B)
示例:int a = 10;int b = 20;int max = (a > b) ? a : b;printf("max = %d", max);输出结果: 20
等价于:int a = 10;int b = 20;int max = 0;if(a>b){max=a;}else {max=b;}printf("max = %d", max);
  • 注意点
    • 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符
    • 条件运算符?和:是一个整体,不能分开使用
#include <stdio.h>
int main(){int a = 10;int b = 5;// 先计算 a > b// 然后再根据计算结果判定返回a还是b// 相当于int max= (a>b) ? a : b;int max= a>b ? a : b;printf("max = %i\n", max); // 10
}#include <stdio.h>
int main(){int a = 10;int b = 5;int c = 20;int d = 10;// 结合性是从右至左, 所以会先计算:后面的内容// int res = a>b?a:(c>d?c:d);// int res = a>b?a:(20>10?20:10);// int res = a>b?a:(20);// 然后再计算最终的结果// int res = 10>5?10:(20);// int res = 10;int res = a>b?a:c>d?c:d;printf("res = %i\n", res);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/49139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NLP】提升文本生成多样性的实用方法

比如用T5模型,训练数据是inputText-outputText格式,预测时do_sample=False # 预测代码from transformers import TFAutoModelForSeq2SeqLM from transformers import AutoTokenizercheckpoint_local = "./path/" tokenizer = AutoTokenizer.from_pretrained(check…

【复读EffectiveC++21】条款21:必须返回对象时,别妄想返回其reference

条款21&#xff1a;必须返回对象时&#xff0c;别妄想返回其reference 此条款&#xff0c;也我刚刚工作时踩过的坑&#xff0c;一个功能总是莫名奇妙的数据丢失&#xff0c;调查的时候就是返回值指针总是在特定逻辑下返回NULL&#xff0c;就是因为我返回的是一个局部变量。 跟…

css属性Clip-path

clip-path 允许你定义一个元素的可视区域的剪切形状。换句话说&#xff0c;你可以使用这个属性来裁剪或隐藏元素的一部分&#xff0c;使其只显示特定形状的区域&#xff0c;比如圆形、椭圆形、多边形或更复杂的 SVG 路径。 基本用法 clip-path 可以接受多种值&#xff0c;包括…

非对称加密算法RSA的OpenSSL代码实现Demo

目录 1 RSA简介 1.1 RSA算法介绍 1.2 RSA算法的速度与安全性 1.3 RSA存储格式 1.3.1 PKCS#1 标准主要用于 RSA密钥&#xff0c;其RSA公钥和RSA私钥PEM格式 1.3.2 PKCS#8 标准定义了一个密钥格式的通用方案&#xff0c;其公钥和私钥PEM格式 2 OpenSSL代码实现 2.1 生…

WSL 2 Oracle Linux 9.1 安装配置

文章目录 环境使用体验安装 Oracle Linux 9.1修改默认存储路径默认 root 用户登录启用 systemd启用 SSH 连接WSL 无法 ping 通宿主机和域名WSL 使用主机代理&#xff08;测试通过&#xff09;WSL 常用命令 环境 OS&#xff1a;Win11 24H2 (OS 内部版本26120.1252) wsl --versio…

闭着眼就能学会的装饰器

目录 一&#xff0c;闭包 1&#xff0c;闭包函数含义以及三要素 2&#xff0c;定义一个简单的闭包 二&#xff0c;装饰器 1&#xff0c;装饰器的作用场景以及特点 2&#xff0c;定义一个简单的装饰器 1&#xff0c;需求1 2&#xff0c;需求2 三&#xff0c;装饰器的实…

初学51单片机之指针基础与串口通信应用

开始之前推荐一个电路学习软件&#xff0c;这个软件笔者也刚接触。名字是Circuit有在线版本和不在线版本&#xff0c;这是笔者在B站看视频翻到的。 Paul Falstadhttps://www.falstad.com/这是地址。 离线版本在网站内点这个进去 根据你的系统下载你需要的版本红线的是windows…

华盈生物-“表面等离子共振(SPR)技术如何进行靶点验证:揭秘靶点锁定的科学魔法”

在药物开发和生物研究中&#xff0c;靶点验证是一个至关重要的步骤。表面等离子共振&#xff08;SPR&#xff09;技术以其高灵敏度和实时监测能力&#xff0c;成为了靶点验证的理想工具。今天&#xff0c;我们将揭示SPR技术在靶点验证中的神奇应用&#xff0c;让我们一起看看它…

第九讲:POU与变量基础

POU(Program Organization Unit)的分类 一、定义及分类 POU即程序组成单元 二、三种POU的作用 1、功能/功能快:看作算法 功能块的POU是比较复杂的指令 三、功能块POU和功能POU的区别 1、理解功能POU(对比) 不添加实例名,就不需要去建立变量,所以就不会占到内存。 因…

算法题目整合4

文章目录 122. 大数减法123. 滑动窗口最大值117. 软件构建124. 小红的数组构造125. 精华帖子126. 连续子数组最大和 122. 大数减法 题目描述 以字符串的形式读入两个数字&#xff0c;编写一个函数计算它们的差&#xff0c;以字符串形式返回。输入描述 输入两个数字&#xff…

物联网专业创新人才培养体系的探索与实践

一、引言 随着物联网&#xff08;IoT&#xff09;技术的迅猛发展&#xff0c;物联网领域的人才需求日益增加。物联网技术作为新一轮信息技术革命的核心&#xff0c;已经渗透到社会生活的各个领域&#xff0c;对推动经济转型升级、提升国家竞争力具有重要意义。因此&#xff0c…

VUE之---slot插槽

什么是插槽 slot 【插槽】&#xff0c; 是 Vue 的内容分发机制&#xff0c; 组件内部的模板引擎使用slot 元素作为承载分发内容的出口。slot 是子组件的一个模板标签元素&#xff0c; 而这一个标签元素是否显示&#xff0c; 以及怎么显示是由父组件决定的。 VUE中slot【插槽】…

Postman的高级功能

Postman是一款功能强大的API测试工具&#xff0c;它提供了许多高级功能来帮助开发者和测试人员更高效地进行API测试和开发。以下是Postman在API测试中的一些高级功能&#xff1a; 1. 集合和文件夹 集合&#xff1a;用于组织相关的API请求。文件夹&#xff1a;在集合内部进一步…

Huffman编码和译码

Huffman编码(Huffman Coding),又称霍夫曼编码或赫夫曼编码,是一种用于无损数据压缩的熵编码(权编码)算法,由大卫霍夫曼(David A. Huffman)在1952年发明。Huffman编码属于可变字长编码(VLC)的一种,其基本思想是根据字符在数据中出现的频率来分配不同长度的编码,出现…

自己开发软件实现网站抓取m3u8链接

几天前一个同学说想下载一个网站的视频找不到连接&#xff0c;问我有没有什么办法,网站抓取m3u8链接 网页抓取m3u8链接。当时一听觉得应该简单&#xff0c;于是说我抽空看看。然后就分析目标网页&#xff0c;试图从网页源码里找出连接&#xff0c;有的源代码直接有,但是有的没有…

(二)C++之类与对象

一.类的申明 class 类名 { private: 私有的数据和成员函数; public: 公用的数据和成员函数; protected: 保护的数据和成员函数 };二.类的成员函数 构造函数&#xff08;类的初始化&#xff0c;创建类时自动调用&#xff1b;初始化表,this指针&#xff09; 默认构造函数 A();…

语法糖的setup和onMounted

遇到的问题&#xff1a;利用:style绑定响应式变量并结合css来动态更换颜色&#xff0c;绑定的响应式变量无法正常渲染 结论&#xff1a;本人将:style绑定响应式变量的值写在onMounted里面了&#xff0c;一个大失误&#xff0c;记录一下&#xff0c;利用setup语法糖默认初始化阶…

Redisson常用的数据结构及应用场景

Redisson 提供了一系列高级数据结构&#xff0c;这些数据结构封装了 Redis 的原生数据类型&#xff0c;提供了 Java API 的便利性和分布式特性。以下是 Redisson 中一些常用的数据结构&#xff0c;场景还在不断完善中&#xff1a; RBucket&#xff1a;这是一个简单的键值对存储…

Java二十三种设计模式-代理模式模式(8/23)

代理模式&#xff1a;为对象访问提供灵活的控制 引言 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一个代替或占位符&#xff0c;以控制对它的访问。 基础知识&#xff0c;java设计模式总体来说设计模式分为三大类&#…

Carefree为高性能设计仿真及人工智能提供一站式解决方案

在当今数字化转型的浪潮中&#xff0c;程易科技作为行业领先的科技创新企业&#xff0c;致力于为客户提供高效、安全、智能的研发资源服务。我们的研发资源服务平台集成了四大核心组件——研发资源统一门户、HPC高性能计算平台、远程可视化前后处理平台以及AI人工智能及算法平台…