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

news2025/7/14 8:10:50

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

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


目录

七、关系操作符

八、逻辑操作符

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.coloradmin.cn/o/36486.html

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

相关文章

视频压缩软件哪个好?万兴优转:好用的视频无损压缩软件

如今&#xff0c;无论是学生党&#xff0c;上班族还是专业的视频制作者&#xff0c;都会遇到视频文件体量太大&#xff0c;需要对视频文件进行压缩的时候&#xff0c;但是又会担心视频压缩以后&#xff0c;画质受损&#xff0c;清晰度不如从前&#xff0c;所以一个好用的视频压…

机器学习笔记之高斯网络(三)高斯马尔可夫随机场

机器学习笔记之高斯网络——高斯马尔可夫随机场引言回顾&#xff1a;马尔可夫随机场——团、势函数高斯马尔可夫随机场点势函数关联的项边势函数相关的项关于多元高斯分布学习任务的核心思想关于条件独立性的总结引言 上一节介绍了高斯贝叶斯网络(Gaussian Bayesian Network,G…

c语言tips-带参main函数

0.写在最前 最近因为工作需要开始重新学c语言&#xff0c;越学越发现c语言深不可测&#xff0c;当初用python轻轻松松处理的一些数据&#xff0c;但是c语言写起来却异常的复杂&#xff0c;这个板块就记录一下我的c语言复习之路 1. main函数的两种表现形式 main函数是c/cpp语言的…

python破解wifi教程

目录 一、安装pywifi 二、构建wifi密码字典 三、python实现wifi破解 四、结果展示 4.1 选择要破解的wifi名称 4.2 获取字典 4.3 成功破解 一、安装pywifi pywifi是在python中一个用于操作无线接口的模块&#xff0c;可以跨平台使用&#xff0c;Windows和Linux都支持 …

Linux下Jenkins服务搭建及配置

一、简介 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;为软件的持续集成提供了一种便捷的方式。 二、Jenkins自动化部署实现原理 Jenkins的自动化部署实…

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

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

pandas是什么以及pandas的三种数据结构Series、DataFrame、MultiIndex的创建方式函数代码

一、pandas概述 pandas是2008年WesMcKinney开发出的专门用于数据挖掘的开源python库&#xff0c;以Numpy为基础&#xff0c;借助numpy模块在计算方面性能高的优势&#xff0c;基于matplotlib&#xff0c;能够简便的画图&#xff0c;具有独特的数据结构 pandas特点 图表的可读…

深度强化学习中深度Q网络(Q-Learning+CNN)的讲解以及在Atari游戏中的实战(超详细 附源码)

需要源码请点赞收藏关注后评论区留下QQ~~~ 深度强化学习将深度学习的感知&#xff08;预测能力&#xff09;与强化学习的决策能力相结合&#xff0c;利用深度神经网络具有有效识别高维数据的能力&#xff0c;使得强化学习算法在处理高纬度状态空间任务中更加有效 一、DQN算法简…

牛客小白月赛62 幼稚园的树

2022.11.25 今晚闲来无事&#xff0c;在zhoj群中看到管理员发布的牛客小白月赛的通知&#xff0c;就和舍友一起参加了。 题目描述 来源&#xff1a;牛客网 牛牛在幼稚园做义工&#xff0c;幼稚园中共有 nnn 颗树&#xff0c;第 1 天中午时它们的高度分别为&#xff1a;h1,h2…

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

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

Day11--首页-轮播图效果

1.创建 home 分支 我的操作&#xff1a; ************************************************** ************************************************** ******* 2.配置网络请求 博主文档&#xff1a; 我的操作&#xff1a; 1》.先初始化一个package.json文件。 2》根据博主的…

MyBatis-Plus 01入门

参考网站 官网&#xff1a;http://mp.baomidou.com 参考教程&#xff1a;http://mp.baomidou.com/guide/ 一、简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率…

测试用例设计方法之等效类,边界值

概念&#xff1a; 等价类划分是一种黑盒测试方法&#xff0c;把无限的测试变成有限的测试。把所有可能的输入数据,即程序的输入域划分成若干等价类,然后从每一个等价类中选取少数具有代表性的数据作为测试用例。依据需求将输入&#xff08;特殊情况下会考虑输出&#xff09;划分…

MySQL之InnoDB浅析

InnoDB是一个兼顾高可靠性和高性能的通用存储引擎。在 MySQL 5.7 中&#xff0c;InnoDB是默认的 MySQL 存储引擎。 InnoDB 的主要优势 支持事物&#xff0c;具备crash-safe的能力支持行锁以及MVCC&#xff0c;具备良好的多用户并发性和性能Buffer Pool&#xff0c;提升热点数…

Redis过期键及内存淘汰策略

写在前面 以下内容是基于Redis 6.2.6 版本整理总结 一、Redis数据库的组织方式 Redis服务器将所有的数据库 都保存在src/server.h/redisServer结构中的db数组中。db数组的每个entry都是src/server.h/redisDb结构&#xff0c;每个redisDb结构代表一个数据库。Redis默认有16个…

测试用例设计方法之正交法

概念&#xff1a; 正交试验设计是研究多因素多水平的一种设计方法&#xff0c;它是根据正交性&#xff0c;由试验因素的全部水平组合中挑选出部分有代表性的点进行试验&#xff0c;通过对这部分试验结果的分析了解全面试验的情况&#xff0c;找出最优的水平组合。正交试验设计…

49 - 多态的概念和意义

---- 整理自狄泰软件唐佐林老师课程 1. 函数重写回顾 父类中被重写的函数依然会继承给子类子类中重写的函数将覆盖父类中的函数通过作用域分辨符&#xff08;::&#xff09;可以访问父类中的函数 p->print()不符合预期&#xff0c;期望调用子类中的print&#xff0c;实际调…

【知识网络分析】研究者合作网络(co-investigator)

研究者合作网络(co-investigator) 1 数据集读取2 网络数据集精简3 网络最大子群获取并可视化4 社团群体分类筛选5 求解网络图中节点中心度相关的指标值并进行可视化1 数据集读取 此处的合作作者(co-investigator)是指基金数据中的作者,数据集 来自于官网提供的加拿大国家…

redis数据库windows下c语言库的编译

使用cmake和make工具进行windows下的编译 下载 1.hiredis下载地址 https://github.com/redis/hiredis 克隆源码 2.cmake下载地址 https://cmake.org/ 3.make for windows http://www.equation.com/servlet/equation.cmd?fa=make 4.mingw 64位 https://download.csdn.net/d…

USB Network Native Driver for ESXi更新支持ESXi8.0

在ESXi8.0发布一个多月后&#xff0c;社区版的USB网卡驱动终于在flings上更新了&#xff0c;USB Network Native Driver for ESXi | VMware Flings Nov 23, 2022 - v1.11 Added support for ESXi 8.0 ESXi800-VMKUSB-NIC-FLING-61054763-component-20826251.zip md…