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
类型
,
只有两个值
:
truefalse
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 & 000 & 101 & 001 & 11
对应位
,
都是
1,
结果才是
1
// 00001000// 00000011// 00000000
cout <<
" 8 & 3 = "
<< (8 & 3) << endl;
位或
|
0 | 000 | 111 | 011 | 11
对应位
,
都是
0,
结果才是
0
只要有一位是
1,
结果就是
1
0 | x x// 00001000// 00000011// 00001011
cout <<
" 8 | 3 = "
<< (8 | 3) << endl;
位非
~
~ 10~ 01
取反
// 00001000// 11110111
unsigned char
x = ~8;
cout << (
int
)x << endl;
//247
异或
^
0 ^ 0 01 ^ 1 00 ^ 1 11 ^ 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 位清 0x = x & (~15);// 把 x 的最低 4 位设置为 0110x = 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*5x = 3+5, 3*5, 10/5;printf("x=%d\n", x); //x=8// 取最后一个表达式的值,作为整个“逗号表达式”的值x = (3+5, 3*5, 10/5);cout << x << endl; //x=2return 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; //31return 0;}
输出转换(C 语言)
#include <stdio.h>int main(void) {printf("%c\n", 255+50); //305 -> 49 ('1');printf("%d\n", 255+50); //305return 0;}
int
类型数据, 按照
%f
格式输出时,将得到错误的输出
float
(或
double)
类型数据,按照
%d
格式输出时,将得到错误的输出
强制类型转化
简单强制类型转换
(
直接使用数据类型
)
int x = 257 + 100;cout << "x=" << x << endl; //357x = ( char )257 + 100; //100000001 -> 00000001cout << "x=" << x << endl; //101
高级强制类型转换
1) static_cast2) dynamic_cast3) const_cast4) reinterpert_cast
[
将在后续章节中
,
详细精讲]
C++
特有的强制类型转换
,现在这里打个预防针,
后续讲解。