C++学习day--09 字符串比较、运算符

news2024/12/23 17:41:38

1、项目练习

1 节 项目需求、项目实现
项目实现:
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main( void ) {
string name;
string pwd;
std::cout << " 请输入账号: " ;
std::cin >> name;
std::cout << " 请输入密码: " ;
std::cin >> pwd;
if (name == "54hk" && pwd == "123456" ) {
std::cout << "1. 网站 404 攻击 " << std::endl;
std::cout << "2. 网站篡改攻击 " << std::endl;
std::cout << "3. 网站攻击记录 " << std::endl;
std::cout << "4.DNS 攻击 " << std::endl;
std::cout << "5. 服务器重启攻击 " << std::endl;
} else {
cout << " 用户名或密码错误 !" << endl;
}
system( "pause" );
return 0;
}

2、  项目精讲-string 字符串的比

复习字符串的比较规则:
按顺先从前往后比较
同序号的字符按“ ASCII ”码值比较
直到遇到对应字符不等或者字符串结束
字符串比较的“运算符”
==
>
<
>= ( 大于或者等于 )
<= ( 小于或者等于 )
!=
c++中,字符串的比较, 可以直接使用以上的”比较运算符”,这里仅只对string类型的字符串,对char数组是不能这样比较的。 C++ 语言里是可以用运算符进行比较的,但是 C 语言只能用库函数进行比较,同时 java 语言里 也只能用库函数比较。 java 语言用运算符比较 字符串是比较字符串的首地址。
比如 :
str1 == str2
字符串比较的“结果”: bool 类型
逻辑真 true
逻辑假 false
表示真假的布尔类型
C++ 语言中,有两种 bool( 布尔 ) 类型的表示方式:
1 )直接使用 bool 类型
bool x = true;
bool 类型 , 只有两个值 :
true
false
2 )使用 0 和非 0 的任何值( C 语言风格)
0: 表示假
非 0: 表示真

 

特别注意:
1>3 是假
1>3 == false 是真
3>1 是真
3>1 == false 是假
bool x;
x = 1 < 3;
类似:
对你的女神 / 男神说:
我爱你
=> 是真
我爱你 == true
=> 是真
我爱你 == false
=> 是假
对你的备胎说:我爱你
=> 是假
我爱你 == true
=> 是假
我爱你 == false
=> 是真
常见错误:
3>2>1 是假
3>2>1 =>
true>1 => 1>1
=> false
3>2 && 2>1
使用“逻辑与”运算。
bool 类型使用场合:
if 语句
for 语句
while 语句
项目精讲 -C 语言字符串的比较
#include <string.h>
int strcmp( const char *str1, const char *str2 );
例如 :
int ret;
ret = strcmp(str1, str2);
返回值:
str1 < str2 时, 返回值< 0(有些编译器返回 -1)
str1 > str2 时, 返回值> 0(有些编译器返回 1)
str1 等于 str2 时, 返回值为 0

 demo:

#include <stdio.h>
#include <string.h>

#include <Windows.h>
int main( void ) {
char addr[32];
int ret;
printf( " 美女,你是哪里人? " );
scanf( "%s" , addr);
if (strcmp(addr, " 湖南 " ) == 0) {
printf( " 美女,我们是老乡啊! \n" );
} else {
printf( " 美女,你和我的同学是老乡啊! \n" );
}
system( "pause" );
return 0;
}

其它数据类型的比较运算

char, int, short, float, double 等数据类型,都可以使用比较运算:
大于:             >
大于或等于 :    >=
小于:            <
小于或等于: <=
不等于:        !=
等于:            ==
(注意:不是 =
比较运算的结果:( 逻辑值
结果为“真”: true
结果为“假”: false
#include <iostream>
#include <Windows.h>
using namespace std;
int main( void ) {
int weight;
printf( " 美女 , 你多重啊 ?\n" );
cin >> weight;

if (weight >= 120) {
cout << " 美女 , 如此丰满 , 真有福气 !" << endl;
} else {
cout << " 美女 , 这么瘦 , 身材不错啊 !" << endl;
}
system( "pause" );
return 0;
}
注意:浮点数的相等比较不能直接用 ==来比较,二是让他们作差,若这个差在某个范围内,则认为这两个数相等。

 

3、逻辑运算符

C 语言完全相同。
现实生活中,任何决策,都是根据多个因素,综合决策的!
有没有钱 , 有没有时间 , 实力允不允许 ?
逻辑与 &&

都为真,逻辑与才是真 只要有一个是假, 逻辑与就是假相当于“而且”
应用场景:
当需要两个条件都满足时,就使用逻辑与
java 语言的 && & 都是与运算,但是 &&有短路功能,而 & 没有短路功能。同理|| | 也是如此。
特别注意:
条件 1 && 条件 2
当条件 1 为真时,才去判断条件 2
当条件 1 为假时,就不再判断条件 2
多个条件 :
条件 1 && 条件 2 && 条件 3
#include <iostream>
#include <Windows.h>
using namespace std;

int main( void ) {
int money;
int days;
cout << " 你有多少钱 ?" ;
cin >> money;
cout << " 你看多少天的假期 ?" ;
cin >> days;
// 如果存款大于 10 , 而且假期大于 10 , 就去旅游
if (money > 100000 && days > 10) {
cout << " 我要去旅游 !" << endl;
} else {
cout << " 还是在家里呆着 " << endl;
}
system( "pause" );
return 0;
}

逻辑或 || 

只要有一个是真, 结果就是真,都为假时,结果才是假,相当于“或者”
多个条件 :
条件 1 ||
条件 2 || 条件 3
应用场景:
只需要满足任意一个条件时,就使用逻辑或
特别注意:
条件 1 || 条件 2
当条件 1 为真时,就不再判断条件 2
当条件 1 为假时,才判断条件 2
和上面一样, || 也有短路功能
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
int main( void ) {
int money;
string love;
cout << " 你有多少钱 ?" << endl;
cin >> money;
cout << " 你爱我吗 ?" << endl;
cin >> love; // 回答 : 爱 或者 不爱
if (money > 1000000 ||
love == " " ) {
cout << " 我们结婚吧 !" << endl;
} else {
cout << " 你是一个好人 !" << endl;
}
system( "pause" );
return 0;
}

逻辑非 ! 

单目运算符 ”, : 只有一个操作数 ,!条件
相当于“不”
应用场景:
当需要不满足某条件时,就使用逻辑非
特别注意:
逻辑非,只对一个条件进行运算!
是一种“单目运算符”
需求 : 如果月薪不到 3 , 那就努力修炼 . 否则 , 就可以去接外包
#include <iostream>
#include <Windows.h>
using namespace std;
int main( void ) {
int money;
int days;
cout << " 你的月薪多少 ?" ;
cin >> money;
if (!(money >= 30000)) {
cout << " 我是菜鸟 , 薪资不到 3 , 我要努力修炼 !\n" << endl;
} else {
cout << " 我要接外包 \n" << endl;
}
system( "pause" );
return 0;
}

操作硬件的位运算 

问题 :
把地址为 0x80040 的寄存器的最低 4 位设置为 0110
解决方案 :
使用位操作
什么是位 ?
内存的基本单元是字节 , 一个字节有 8 .
位与 &
0 & 0
0
0 & 1
0
1 & 0
0
1 & 1
1
对应位 , 都是 1, 结果才是 1
// 00001000
// 00000011
// 00000000
cout << " 8 & 3 = " << (8 & 3) << endl;
位或 |
0 | 0
0
0 | 1
1
1 | 0
1
1 | 1
1
对应位 , 都是 0, 结果才是 0
只要有一位是 1, 结果就是 1
0 | x x
// 00001000
// 00000011
// 00001011
cout << " 8 | 3 = " << (8 | 3) << endl;
位非 ~
~ 1
0
~ 0
1
取反
// 00001000
// 11110111
unsigned char x = ~8;
cout << ( int )x << endl; //247
异或 ^
0 ^ 0 0
1 ^ 1 0
0 ^ 1 1
1 ^ 0 1
对应位不同 , 结果才是 1
// 00001000
// 00000011
// 00001011
cout << (8^3) << endl; //11
<< 左移
右边的位用 0 来填充 , 移动超出左边边界的位则直接抛弃。
向左移动 n 个位置,就等同于乘以 2 n 次方
只适用于 : int/short/long/char 等定点数类型 (float/double 浮点数类型不能使用)
// 00001000
// 01000000
cout << (8<<3) << endl;
//8*2*2*2 = 64
>> 右移
如果左操作数是无符号类型,则左边多出来的位用 0 来填充。
如果左操作数是有符号类型,则左边多出来的位用 符号位 ( 最高位 ) 来填充。
向左移动 n 个位置,就等同于除以 2 n 次方
只适用于 : int/short/long/char 等定点数类型 (float/double 浮点数类型不能使用 )
// 00001000
// 00000001
cout << (8>>3) << endl;
//1
应用 :
把一个整数的的最低 4 位设置为 0110
cout << " 请输入一个整数 : " << endl;
cin >> x;
// x 的最低 4 位清 0
x = x & (~15);
// x 的最低 4 位设置为 0110
x = x | 6;
cout << "x=" << x << endl;

其它运算 

已经学习了 :
x = 100;
== > >= < <= !=
&& || !
& |
~ ^ >> <<
算术运算

 

 

赋值运算
x = 10; // x 的值 设置为 10, 10 写到变量 x 中。
x = 10 + a;
左边必须是变量
“优先级”很低,只比 "," (逗号元素符)高。
复合赋值运算
x += 10;
// x = x + 10
x -= 10;
// x = x - 10
类的还有: *= , /=, %= 等。
自增自减运算
i++ => i = i+1
++i => i = i+1
i-- => i = i-1
--i => i = i-1
i = 100;
x = i++; // x = 100
i = 100;
x = ++i; // x= 101
1. 只能对变量做 ++ -- 运算,不能对变量和表达式做 ++ 和--运算
5++; //ERROR
(3+x)++; //ERRO
2. 建议尽量使用前缀自增(自减),以避免错误。
逗号运算符
优先级最低
#include <stdio.h>
int main(void) {
int x;
// 先计算 x = 3+5, 再计算 3*5
x = 3+5, 3*5, 10/5;
printf("x=%d\n", x); //x=8
// 取最后一个表达式的值,作为整个“逗号表达式”的值
x = (3+5, 3*5, 10/5);
cout << x << endl; //x=2
return x;
}
因为逗号表达式的优先级最低,比赋值运算符优先级还低,因此x=8,而不是 2

 

三目运算符
条件 ? 表达式 1 :表达式 2
如果条件为真,就取表达式 1 作为整个表达式的值
如果条件为假,就取表达式 2 作为整个表达式的值
#include <iostream>
#include <Windows.h>
using namespace std;
int main( void ) {
int salary;
printf( " 请输入您的月薪 : " );
scanf( "%d" , &salary);

cout << (salary > 30000 ? " 老鸟 " : " 菜鸟 " ) << ", 晚上好 !" << endl;
system( "pause" );
return 0;
}
使用多个运算符时的优先级
一共有 15 个级别!
不需强制记忆,只需要掌握以下常用的优先级:
最高优先级: ( ) [ ]
最低优先级:逗号表达式
倒数第二低优先级:赋值和复合赋值 (= +=, -= ...)
x = a+ b*c;
> 算术运算符 > 关系运算符 > && > || > 赋值运算符
(3 + 4 < 5 && 6 > 7) || ( 8 > 7) ;

4、数据类型之间的转换

类型转换的概念
为什么需要“类型转换”
参与运算的两个操作数的数据类型,必须相同!
类型转换的类别:
1. 隐式类型转换 ( 自动完成转换) 小范围内的数转为大范围 内数
1 )算数转换
2 )赋值转换
3 )输出转换
2. 强制类型转化( 大范围内的数转为小范 围内的数)
隐式类型转换
算数转化
(+,-,*,/,%)
char , int, long, long long, float, double
15 + 3.14 => 15.0 + 3.14
赋值转换
#include <stdio.h>
int main(void) {
int x;
// 计算结果 31.4 转换为 int 类型,因为赋值符号的左边变量的类型是 int 类型
x = 3.14 * 10.0;
cout << x << endl; //31
return 0;
}

输出转换(C 语言) 

#include <stdio.h>
int main(void) {
printf("%c\n", 255+50); //305 -> 49 ('1');
printf("%d\n", 255+50); //305
return 0;
}
int 类型数据, 按照 %f 格式输出时,将得到错误的输出
float (或 double) 类型数据,按照 %d 格式输出时,将得到错误的输出

 

强制类型转化
简单强制类型转换
( 直接使用数据类型 )
int x = 257 + 100;
cout << "x=" << x << endl; //357
x = ( char )257 + 100; //100000001 -> 00000001
cout << "x=" << x << endl; //101
高级强制类型转换
1) static_cast
2) dynamic_cast
3) const_cast
4) reinterpert_cast
[ 将在后续章节中 , 详细精讲] C++ 特有的强制类型转换 ,现在这里打个预防针, 后续讲解。

 

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

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

相关文章

GPT-4的免费使用方法分享

目录 方法1&#xff1a;使用Ora.sh的LLM应用 方法2&#xff1a;使用https://steamship.com 方法3&#xff1a;使用https://nat.dev 方法4&#xff1a;http://tdchat.vip 方法5&#xff1a;使用Poe网站或App 方法6&#xff1a;使用 Opencat App 方法7:使用https://Huggin…

uniApp实现公农日历相互转换、公历、农历、阳历、阴历、calendar

文章目录 效果图1、组件1.1、html部分1.2、JavaScript部分1.3、style部分 2、使用组件3、总结 效果图 1、组件 1.1、html部分 <template><view v-if"isCalendar" class"calendar_box"><view v-show"!isTime" class"btn_ca…

Linux服务器使用supervisorctl命令部署Java服务详解

我们公司采用supervisorctl命令运行Java -jar包&#xff0c;觉得还是很方便的&#xff0c;此篇文章教你如何使用supervisorctl从零部署Java服务 安装jdk 首先肯定是下载安装Java的运行环境 jdk 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#jav…

WindowContainer相关类

WindowContainer类   从WindowContainer类的注释中可以看出该类中定义了一些公共的方法和属性给直接持有窗口的自己或者它的孩子使用&#xff0c;像RootWindowContainer、DisplayContent、DisplayArea、DisplayArea.Tokens、TaskDisplayArea、Task、ActivityRecord、WindowTok…

【话题讨论】-浅谈VR与AR

一、引言 随着ICT基础技术的发展&#xff0c;我们现在社会中的基础ict设施已经逐步完善&#xff0c;从而我们的社会也开始出现科幻片中才会有的场景&#xff0c;比如&#xff1a;我们可以构件一个虚拟3D沙盘。 还有我们熟悉的各类智能眼镜&#xff0c;已经进入到千家万户&…

干货 | Mendeley 的基础使用方法

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 当阅读的文献越来越多&#xff0c;如何整理文献就成了一个大问题。文献管理软件则减轻了我们文献整理的负担。目前的文献管理软件使用较多的有Endnote、Notepress、Mendeley、Zotero等。 …

边无际首发ChatIoT:AI大模型从数字世界向物理世界迈进

将大模型的能力带到物理世界&#xff0c;除了微软、谷歌&#xff0c;还有一家中国的创业公司。边无际作为专注于物联网开发平台研发的科技公司&#xff0c;紧跟AI大模型带来的生产力变革&#xff0c;首发ChatIoT&#xff0c;率先将大模型的技术应用于物联网领域。 在微软、谷歌…

【高并发】网络模式

I/O 多路复用 多线程创建 服务器的主进程负责监听客户的连接&#xff0c;一旦与客户端连接完成&#xff0c;accept() 函数就会返回一个「已连接 Socket」&#xff0c;这时就通过 fork() 函数创建一个子进程&#xff0c;实际上就把父进程所有相关的东西都复制一份&#xff0c;…

多层感知器Multi-Layer Perception ,MLP

MLP神经网络的结构和原理 神经网络其实是对生物神经元的模拟和简化&#xff0c;生物神经元由树突、细胞体、轴突等部分组成。 生物神经元具有兴奋和抑制两种状态&#xff0c;当接受的刺激高于一定阈值时&#xff0c;则会进入兴奋状态并将神经冲动由轴突传出&#xff0c;反之则…

nginx配置文件nginx.conf的结构、各个指令(元素)的含义以及用法

nginx配置文件nginx.conf的结构、各个指令&#xff08;元素&#xff09;的含义以及用法 默认的nginx.confnginx.conf配置文件官方解释nginx.conf配置文件中每一条指令或指令快的含义是什么&#xff0c;以及用法&#xff08;使用范围&#xff1a;应该配置在什么地方&#xff09;…

今年的面试难度有点大....

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;又得准备面试了&#xff0c;不知道从何下手&#xff01; 不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约时间&a…

Selenium:利用select模块处理下拉框

目录 一、具体问题 二、解决方案 在UI自动化测试中&#xff0c;有时候会遇到页面元素无法定位的问题&#xff0c;包括xpath等方法都无法定位&#xff0c;是因为前端元素被设置为不可见导致。 这篇博客&#xff0c;介绍下如何通过JavaScript修改页面元素属性来定位的方法。。…

2021年科幻美剧和《人月神话》有啥渊源,书中有个小bug你知道吗

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 《人月神话》1975版和1995版的封面是这样的&#xff1a; 图1 1975版“The Mythical Man-Month”封面 图2 1995版“The Mythical Man-Month”封面 书中第1章“焦油坑&…

【JS每N日一练】【自动化】gitcode创建子项目并导入git

▒ 目录 ▒ &#x1f6eb; 导读需求 1️⃣ 创建子项目手动操作编写代码 2️⃣ 导入github项目手动操作编写代码 &#x1f6ec; 文章小结&#x1f4d6; 参考资料 &#x1f6eb; 导读 需求 github访问时好时不好的&#xff0c;而且克隆代码及其麻烦&#xff0c;经常失败。所以小…

C语言 | 结构体

C语言 | 结构体 文章目录 C语言 | 结构体C语言结构体详解:1.实例&#xff08;多重嵌套&#xff09;1-1.定义1-2.初始化 2.结构体2-1、结构体2-1-1、结构体的类型定义&#xff1a;2-1-2、结构体变量的定义&#xff1a;2-1-3、结构体变量的初始化&#xff1a;2-1-4、使用&#xf…

【夜莺(Flashcat)V6监控】1初识夜莺:介绍及部署

简介 夜莺&#xff08; Nightingale &#xff09;是一款国产、开源云原生监控分析系统&#xff08;从 v6 版本开始&#xff0c;尝试转型成为统一观测平台&#xff09;&#xff0c;集数据采集、可视化、监控告警、数据分析于一体。于 2020 年 3 月 20 日&#xff0c;在 github …

这就是阿里巴巴月薪20K+测试岗的面试题吗?让我这个3年的测试工程师看的冷汗直流.....

朋友入职已经两周了&#xff0c;整体工作环境还是非常满意的&#xff01;所以这次特意抽空给我写出了这份面试题&#xff0c;而我把它分享给伙伴们&#xff0c;面试&入职的经验&#xff01; 大概是在2月中的时候他告诉我投递了阿里巴巴并且简历已通过&#xff0c;2月23经过…

NPM 包管理器简介

目录 npm 简介 包&#xff08;Packages&#xff09; 更新包 版本控制 运行任务 npm 简介 npm 是 Node.js 的标准包管理器。 npm 的快速指南&#xff0c;强大的包管理器是 Node.js 成功的关键。2017 年 1 月&#xff0c;超过 350000 个软件包被报告在 npm 注册表中列出&a…

java中的Servlet对象生命周期以及过滤器监听器

review: Servlet生命周期中的初始化方法&#xff1a; init() &#xff0c; init(config) public void init(ServletConfig config) throws ServletException { this.config config ; init(); } 因此&#xff0c;如果我们需要在初始化时执行一些自定义的操作&#xff0c;那么我…

简单易用又功能强大,来看看Postman接口测试工具怎么用?

一、Postman介绍 Postman官网上这样介绍它:"Manage all of your organizations APIs in Postman, with the industrys most complete API development environment."看的出来Postman是功能强大的API测试的工具 Postman 提供功能强大的 Web API 和 HTTP 请求的调试&a…