运算符和分支
1. 运算符
1.1 自增自减运算符
基本格式: ++ –
作用:自增自减运算符操作的变量,存储数据自增 1 或者 自减 1
语法规则:
- 自增自减运算符有且只能操作变量,不允许操作常量
- 自增自减运算符在变量之前,首先修改变量数据,之后提取变量存储数据内容参与当前行代码运行
- 自增自减运算符在变量之后,首先提取变量存储数据内容参与当前行代码运行,提取之后自增自减运算符立即对当前变量数据进行修改
墙裂建议
- 自增自减运算符尽量减少使用,如果必要使用请单独成行
- 建议使用 += 1 和 -= 1 替代自增自减运算符,提升代码阅读性
1.2 面试题
int num = 5; int ret = num++ * ++num; /* num = 7 ret = 35 解答: num = 7 因为 num 在整个代码中执行了两次自增操作,num 原本为 5,自增两次之后为 7 int ret = num++ * ++num; num++ 自增在后 1. 首先提供变量存储数据内容给到当前行代码,对于表达式而言 提供的数据为【5】 2. 之后 num 存储的数据自增操作,num 存储的数据为 6 ++num 自增在前 1. 首先执行自增操作,对 num 存储的数据内容进行修改,之前表达式中 num 数据 存储情况已经修改为 6,num 执行自增操作,num 存储数据为 7 2. 之后提供当前 num 存储数据给到表达式执行,提供给表达式的数据为【7】 int ret = 5 * 7 ==> 35 */ int num = 5; int ret = num++ * ++num - (num++ - num--) / num-- + --num;
int num = 5; ++(num++); // ++num++ /* num = ?; 语法错误! 原则 自增自减运算符有且只能操作变量,不允许操作常量。 ++(num++) 按照小括号操作优先,num++,提供当前存储数据 5 参与当前行代码,同时 num 变量存储 的数据自增 1 ,当前 num 存储结果为 6 整个表达式变为 ++(5), 5 是一个数据,是一个值,是一个常量!自增自减运算符不得操作 常量,语法错误! */
1.3 逻辑运算符
与 或 非
与: && 同真为真,有假【即】假
或: || 有真【即】真,同假为假
非: ! 强牛,犟, 取反
#include <iostream>
using namespace std;
int main(int argc, char * argv[])
{
bool ret = 10 > 5 && 10 > 6;
cout << "ret : " << ret << endl; // true
ret = 10 > 5 && 10 > 20;
cout << "ret : " << ret << endl; // false
ret = 10 > 5 || 10 > 20;
cout << "ret : " << ret << endl; // true
ret = 10 > 15 || 10 > 20;
cout << "ret : " << ret << endl; // false
ret = !(10 > 5 && 10 > 20);
cout << "ret : " << ret << endl; // true
ret = !(1);
cout << "ret : " << ret << endl; // false
return 0;
}
1.4 逻辑运算符短路原则
用于优化条件排列,降低代码运行逻辑复杂度!
int num = 10; bool ret = num > 15 && ++num > 5; ret = false(0); num = 10; /* 解答: 逻辑与短路原则, 同真为真,有假【即】假。 如果逻辑与中发现了 false 条件,整个表达式的结果可以明确为 false,从 false 条件开始之后的内容不再执行,CPU 可以降低一定的工作压力。 num > 15 && ++num > 5; num > 15 ==> 10 > 15 ==> false 整个表达式结构为 false 与之后的 ++num > 5 不再执行! num 数据没有被自增修改。 */
int num = 10; bool ret = num > 5 || ++num > 5; ret = 1; num = 10; /* 解答: 逻辑或短路原则,|| 有真【即】真,同假为假 如果逻辑或中发现了 true 条件,整个表达式结果可以明确为 true,从 true 条件开始之后的内容不再执行,提升 CPU 执行效率和代码效率。 num > 5 || ++num > 5; num > 5 ==> 10 > 5 ==> true 整个表达式结果已明确!!! 后续内容不再执行! 之后的 ++num > 5 不再执行! num 数据没有被自增修改。 */
1.5 运算符案例
字符判断,字符操作请使用字符本身,不要使用编码值。
判断一个字符是否为数字字符
char ch = '1'; // 数字字符 bool ret = ch >= '0' && ch <= '9'; // 限制判断当前字符是否在数字字符范围以内
判断一个字符是否为英文大写字母
char ch = 'Q'; // 英文大写字母 bool ret = ch >= 'A' && ch <= 'Z'; // 限制判断当前字符是否在英文大写字符范围以内
判断一个字符是否为英文小写字母
char ch = 'q'; // 英文小写字母 bool ret = ch >= 'a' && ch <= 'z'; // 限制判断当前字符是否在英文小写字符范围以内
判断一个字符是否为英文字母
char ch = 'a'; // 英文字母 // 判断字符是否为英文字符条件,逻辑与 && 的优先级高于 逻辑或 || bool ret = ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z'; // 小括号优化优先级或者整体条件认知,可有可无! bool ret = (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
数值判断
闰年条件
可以被 4 整除,但是不能被 100 整除
year % 4 == 0; // 表示可以被 4 整除 year % 100 != 0; // 表示不可以被 100 整除
或者可以被 400 整除
year % 400 == 0; // 表示可以被 400 整除
year % 4 == 0 && year % 100 != 0 || year % 400 == 0
2. 分支
2.1 概述
主要处理代码需要进行条件执行的程序,简单的来说满足条件执行,不满足条件不执行!主要有if分支结构,Switch case
2.2 if 分支
// 格式
if(/*条件判断,要求提供数据为bool类型 0 or 1*/)
{
// if 满足条件执行目标语句内容
}
/*
执行流程:
程序执行到if分支结构,首先判断if之后小括号的数据内容是否为true/ 非0, 执行大括号中的代码内容,如果为false/0大括号中的代码内容不在执行*/
#include <iostream>
using namespace std;
int main (int argc , char * [])
{
int money = - 100000000;
if(money = 5 )
{
cout << "购买法拉利endl;
}
cout << "购买成功"<< endl;
return 0 ;
}
2.3 if else 分支
if (/*条件判断 要求bool类型 0 或 1 */)
{
//满足条件对应的代码模块内容
}
else
{
//不满足条件对应的代码块内容
}
/*
执行流程:
程序直行到 if else 结构,首先判断if 之后的小括号中的条件判断是否为true,如果为true执行if 之后大括号的代码内容,如果为flase,执行else
*/
#include <iostream>
using namespace std;
int main(int argc , char * argv [])
{
int money = 10 ;
if(money > 50)
{
cout << "鸡排" << endl;
}
else
{
cout << "板烧鸡腿堡" << endl;
}
cout << " 晚餐" << endl;
}
2.4 if else if 分支
//格式
if(/*条件匹配一*/)
{
// 满足条件一执行代码
}else if ( /* 条件匹配二*/)
{
// 满足条件二执行代码
}
}else if ( /* 条件匹配三*/)
{
// 满足条件三执行代码
}else
{
}
#include <iostream>
using namespace std;
int main ( int argc , char * argv [])
{
int score = 89 ;
if( 100 == score )
{
cout << "大型玩偶" << endl;
}
else if( 85 < score && score <=99 )
{
cout << "小型玩偶" << endl;
}
else if (60 < score && score <=85)
{
cout << "钥匙扣" << endl;
}
else
{
cout << "谢谢参与" << endl ;
}
}
2.5 switch case 结构
//格式
switch (/* 变量*/)
{
case 常量1:
处理方式1;
break
case 常量2:
处理方式2;
break
case 常量3:
处理方式3;
break
case 常量4:
处理方式4;
break
}
#include <iostream >
using namespace std;
int main (int argc , char * argv [])
{
cout << "烤肠" << endl;
cout << "猪蹄" << endl;
cout << "鸭腿" << endl;
cout << "煲仔饭" << endl;
int choose = 0 ;
cin >> choose ;
switch(choose)
{
case 1 ;
cout << "7RNB" << endl;
break;
case 2 ;
cout << "37RNB" << endl;
break;
case 3 ;
cout << "12RNB" << endl;
break;
case 4 ;
cout << "14RNB" << endl;
break;
}
}