第五站:操作符(第二幕)

news/2024/4/30 1:36:42/文章来源:https://blog.csdn.net/jhdhdhehej/article/details/128018529

在前面的文章中我们详细讲解了操作符的一些内容, 今天我们来继续了解操作符剩余的内容

操作符第一幕的传送门在这:第五站:操作符(第一幕)


目录

七、关系操作符

八、逻辑操作符

1.基础知识

2.几道经典的题目

九、条件操作符

十、逗号表达式

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

1. [ ] 下标引用操作符

2.函数调用操作符

总结


七、关系操作符

关系操作符共有如下几种

==          //用于判断两个相等

!=        //用于判断两个不相等

>=         

<=

>

<

这些操作符都比较简单。只要满足条件,计算出来的是01,否则就是0。

警告:唯一需要注意的一点就是==和=号极其容易混淆,在这里要注意区分。否则就会出现一些不可预知的后果

八、逻辑操作符

1.基础知识

逻辑操作符有以下两种

&&        逻辑与         并且

||           逻辑或         或者

值得注意的是,这里不要与按位与和按位或进行了混淆。

&---按位与        

| ---按位或

这两个计算的是二进制的,而我们逻辑与和逻辑或就不关心二进制了,他们只关心真假。只要是0就是假,非0就是真。

对于a&&b而言:(只要有假就是假)

对于a||b而言:   (只要有一个为真,就是真)

 关于这两个的运用,最经典的一个题目就是判断闰年的计算方式。这个在过去的文章中已经讲解了多次。这里也不再赘述

2.几道经典的题目

我们来看这样一段代码,并自己想出他的答案是多少?

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;
}

 有很多人第一反应毫无疑问就是1 3 4 5。这是一个经典的错误,标准的零分。那么正确的答案是什么呢?我们先运行一下

 答案是1 2 3 4,那么这是为什么呢?为什么和我们的预期不一样呢?其实真正的原因是因为&&操作符左边只要为假,右边就无需进行计算下去了。类似于短路了。

而我们这道题正是符合了这个规则,a++,先引用,引用以后他是0,右边没必要进行计算下去了,但是a还是会+1的,所以最终答案就是1 2 3 4

那么如果我们将题目进行修改呢?会发生什么事情呢?

include <stdio.h>
int main()
{int i = 0,a=1,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;
}

此时我们会发现,a不在是1,后面的逻辑与都可以继续判断下去,所以最终答案就是2 3 3 5

 那么如果代码改为了||呢?又是如何呢?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int i = 0, a = 1, b = 2, c = 3, d = 4;//i = a++ && ++b && d++;i = a++||++b||d++;printf(" a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);return 0;
}

 我们运行一下

 这里又为什么是2 2 3 4了呢?又发生了什么呢?其实这是因为,a一开始是1,先引用了这个1,后面的其实无需在进行判断了,因为已经恒为真了。所以只有a会+1.其余都不会改变,因此答案就是2 2 3 4,像这种现象,有的时候称作短路

我们继续看这段代码

#define _CRT_SECURE_NO_WARNINGS 1
#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\n d = %d\n", a, b, c, d);return 0;
}

这下相信大家不会在出现错误了,答案是1 3 3 4

九、条件操作符

exp1?exp2:exp3

这个语句的意思是,如果1为真,则执行2,3不执行;如果1为假,则执行3,2不执行。这也称作三目操作符

我们直接来举一个例子:求两个数中的较大数

这个比较简单,我们直接给出代码

#include<stdio.h>
int main()
{int a = 3;int b = 5;int ret = a > b ? a : b;printf("%d", ret);return 0;
}

十、逗号表达式

exp1, exp2, exp3, …expN

这个表达式又什么用呢?这个表达式的作用是从左到右依次进行计算,但是最终的计算结果是最后一个表达式的值。

我们看这样一个代码

#include<stdio.h>
int main()
{int a = 1;int b = 2;int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式pritf("%d %d %d", a, b, c);return 0;
}

计算结果为 12 13 13

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

1. [ ] 下标引用操作符

操作数:一个数组名 + 一个索引值

我们看这样一段代码

#include<stdio.h>
int main()
{int arr[10] = { 1,2,3,4 };printf("%d", arr[3]);//[]就是下标引用操作符return 0;
}

该代码中,[]就是一个下标引用操作符,而他的操作数就是arr和3

2.函数调用操作符

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

我们看这样一段代码

#include<stdio.h>
#include<string.h>
int main()
{int len = strlen("abcdef");//()就是函数调用操作符号,操作数就是strlen和"abcdef"return 0;
}

这段代码中()就是函数调用操作符号,操作数就是strlen和"abcdef",所以我们还能看出一个结论,函数调用操作符至少有一个操作数

3.访问一个结构体成员

.        结构体.成员名

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

我们来举一个例子,请看如下所示代码

#include<stdio.h>
struct BOOK
{char name[20];char author[20];int price;
};
void Print(struct BOOK* p)
{printf("%s %s %d\n", (*p).name, (*p).author, (*p).price);printf("%s %s %d\n", p->name, p->author, p->price);
}
int main()
{	struct BOOK b1 = { "信号与系统","吴大正",50 };struct BOOK b2 = { "数据结构","王卓",66 };printf("%s %s %d\n", b1.name, b1.author, b1.price);printf("%s %s %d\n", b2.name, b2.author, b2.price);Print(&b1);}

这段代码有四种不同结构体打印方式,运行结果如下

 

还有一个经典的例子是这样的,请看这段代码

#include <stdio.h>
struct Stu
{char name[10];int age;char sex[5];double score;
};
void set_age1(struct Stu stu)
{stu.age = 18;
}
void set_age2(struct Stu* pStu)
{pStu->age = 18;//结构成员访问
}
int main()
{struct Stu stu;struct Stu* pStu = &stu;//结构成员访问stu.age = 20;//结构成员访问set_age1(stu);printf("%d\n", stu.age);pStu->age = 20;//结构成员访问set_age2(pStu);printf("%d\n", stu.age);return 0;
}

这段代码的运行结果为

原因是,第一个是传值调用,是一份临时拷贝,所以不会修改原来的值

第二个是传址调用,可以修改原来的值


总结

本节主要讲解了关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用,函数调用,结构体成员访问操作符的相关知识。如果对你有帮助,不要忘记点赞加收藏哦!!!

本站未完,欲知后事,请看下节

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

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

相关文章

手摸手教会你在idea中配置Tomcat进行servlet/jsp开发(多图超详)

1. 下载安装idea&#xff0c;创建project&#xff0c;如果没有JDK可以通过idea指定文件夹并下载JDK。工程就是普通的Java工程&#xff0c;名字为webdemo 2.因为是Web项目&#xff0c;所以要对这个普通的项目进行WEB扶持^^&#xff0c;在项目名称webdemo上右键单间选择菜单项&qu…

20221125使用PR2023自动识别obs-studio录屏生成的MKV视频的字幕

20221125使用PR2023自动识别obs-studio录屏生成的MKV视频的字幕 2022/11/25 19:07 01 obs.png obs studio &#xff08;64bit&#xff09; 02 obs 设置.png 03 obs 输出.png 04 obs默认为MKV.png 05 obs改mkv为MP4.png 警告&#xff1a;如果文件无法完成&#xff08;例如&…

嵌入式驱动初级-阻塞与非阻塞

文章目录前言一、五种IO模型二、阻塞与非阻塞三、多路复用前言 记录嵌入式驱动学习笔记 一、五种IO模型 当应用程序对设备驱动进行操作的时候&#xff0c;如果不能获取到设备资源&#xff0c;那么阻塞式 IO 就会将应用程 序对应的线程挂起&#xff0c;直到设备资源可以获取为止…

b站黑马JavaScript的Ajax案例代码——图书管理案例

目录 目标效果&#xff1a; 重点原理&#xff1a; 1.js数组操作中push方法 2.jquery中append方法 3.js数组操作中join方法 4.jQuery中attr方法 5.jQuery中trim方法 代码部分&#xff1a; 1. 图书管理案例.html(js部分全是重点&#xff0c;html部分用于看结构) 2.jquery.js…

mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)

mybatis复习05,mybatis的缓存机制&#xff08;一级缓存和二级缓存&#xff09;MyBatis的缓存机制MyBatis的一级缓存MyBatis的二级缓存二级缓存的相关配置MyBatis缓存查询的顺序整合第三方缓存EHCacheEHCache配置文件说明&#xff1a;MyBatis的缓存机制 MyBatis作为持久化框架&…

什么是DCS系统?DCS和SCADA的区别

如果你在工业自动化的企业环境中操作&#xff0c;可能听说过分布式控制系统 (DCS) 和监控和数据采集 (SCADA) 系统。 DCS系统和SCADA系统有很多共同点&#xff0c;因为它们都被称为受控计算机系统&#xff0c;接收和评估合法数据以实现远程访问监控和管理。 DCS(分布式控制系…

Flutter 中使用 extension 使项目更具可读性和效率 01

Flutter 中使用 extension 使项目更具可读性和效率 01 原文 https://medium.com/bedirhanssaglam/make-your-flutter-projects-more-readable-and-effective-with-extensions-b7dffd32e2f4 前言 代码的可读性和实用性在《 Flutter 》中非常重要。今天我们将编写一些 extension …

体系结构27_多处理机(1)

单处理机的发展正在走向尽头&#xff1f; 并行处理机在未来将会发挥更大的作用。 1.获得超过单处理器的性能&#xff0c;最直接的方法就是把多个处理器连在一起。 2.自1985年以来&#xff0c;体系结构的改进使性能迅速提高&#xff0c;这种改进的速度能否持续下去还不清楚&a…

信号类型(雷达)——雷达波形认识(一)

系列文章目录 《信号类型&#xff08;雷达通信&#xff09;》 文章目录 前言 简述 总结 前言 本文将结合个人研究经验&#xff0c;从雷达波形简单谈谈我对雷达的认识。之后将对常见的雷达波形进行简单分析。 简述 雷达的波形决定了信号处理的手段以及对应的雷达功能&#x…

体系结构29_多处理机的互联网络

互连网络是将集中式系统或分布式系统中的结点连接起来所构成的网络&#xff0c;这些结点可能是处理器、存储模块或者其它设备&#xff0c;它们通过互连网络进行信息交换。在拓扑上&#xff0c;互连网络为输入和输出两组结点之间提供一组互连或映象&#xff08;mapping&#xff…

【Linux】进程创建/终止/等待/替换

目录 一、子进程的创建 1、fork函数的概念 2、如何理解fork拥有两个返回值 3、fork调用失败的场景 二、进程的终止 1、main函数返回值 1.1main函数的返回值的意义 1.2将错误码转化为错误信息 1.3查看进程的退出码 2、进程退出的情况 1、进程的正常退出与异常退出 2…

Nodejs中包的介绍及npm安装依赖包的多种方法

文章目录1 包的介绍1.1 什么是包1.2 包的来源1.3 为什么需要包1.4 从哪里下载包1.5 如何下载包2 npm2.1 npm安装依赖包2.2 装包后多了哪些文件2.3 安装指定版本的包1 包的介绍 1.1 什么是包 Nodejs中的第三方模块又叫做包 就像电脑和计算机指的是相同的东西&#xff0c;第三…

推特自动发帖,全天占据核心流量

利用热门趋势和Hashtags标签 Twitter有一个热门趋势&#xff0c;跟微博热搜是差不多的&#xff0c;卖家可以多关注一下热门趋势&#xff0c;看看有没有和产品相关的内容。在帖子中加入趋势性和热门的标签&#xff0c;是一种非常好的营销方式。 这一方面能够增加推文的热度&am…

android源码-ContentProvider实现原理分析

前言&#xff1a; 最初的目的是想研究下ContentProvider产生ANR原因的&#xff0c;但是如果要讲ANR的原因&#xff0c;那么必须要了解ContentProvider的完整实现原理&#xff0c;所以本篇就先讲一下ContentProvider的实现原理&#xff0c;下一篇再去讲ANR的原因。 本篇主要会讲…

Baklib知识库|为什么知识共享工具对减少内部知识缺口至关重要

你的企业是否存在知识缺口&#xff1f; 知识缺口——没有对关键知识进行研究和记录&#xff0c;以有效地传播信息&#xff0c;并教育企业内外的用户——可能是寻求生产率最大化并最终实现利润增长的公司的一个关键缺陷。知识&#xff08;或数据、关键信息等&#xff09;是你的…

网络通信基本原理

通讯的必要条件 主机之间需要有传输介质。光纤、蓝牙、wify主机上必须有网卡设备。把二进制信息转为高低电压的过程就是数据的调制过程。把电信号转为二进制信息的过程为解调制。主机之间需要协商网络速率。 网路的通讯方式 日常生活中&#xff0c;我们通讯的方式不可能只有…

现代密码学导论-14-基于伪随机发生器的EAV安全

目录 3.3.3 基于伪随机发生器的EAV安全 用伪随机发生器进行加密的图示 CONSTRUCTION 3.17 一种基于伪随机发生器的私钥加密方案 THEOREM 3.16 基于伪随机发生器的私钥加密方案的EAV安全 THEOREM 3.16 的证明 最后来理一下 3.3.3 基于伪随机发生器的EAV安全 用伪随机发生…

sql server如何卸载干净?来看这里

一、如何卸载干净 1.关闭服务 快捷键&#xff1a;windows R&#xff0c;在命令行输入&#xff1a; services.msc&#xff0c;把有关SQL都关闭 &#xff0c;下图所示&#xff1a; 2.到控制面板&#xff0c;卸载 sql server 3.删除磁盘里的文件 我的在c盘里&#xff0c;看各位…

Linux Command htpasswd 创建密码文件

文章目录Linux Command htpasswd 创建密码文件1. 简介2. 安装3. 语法4. 选项5. 示例6. 其他Linux Command htpasswd 创建密码文件 1. 简介 htpasswd是Apache的Web服务器内置的工具,用于创建和更新储存用户名和用户基本认证的密码文件。 2. 安装 centos 7、 redhat&#xff…

详解设计模式:简单工厂模式

简单工厂模式&#xff08;Smiple Factory Pattern&#xff09;&#xff1a;定义一个工厂类&#xff0c;他可以根据参数的不同返回不同类的实例&#xff0c;被创建的实例通常都具有共同的父类&#xff0c;简单工厂模式也被称为静态工厂模式。 &#xff5e; 本篇内容包括&#xf…