1.条件语句if和do...while(0)形式的宏
1.1 if
// 如果条件中使用了数值类型的变量,建议将变量写在后面,e.g. 10 == i
int i = 100;
if(i = 10) // if 条件永远为真
{
cout << "i == 10" << endl;
}
if(i == 10)
{
cout << "i == 10" << endl;
}
else if(i == 11)
{
cout << "i == 11" << endl;
}
else if(i == 12)
{
cout << "i == 12" << endl;
}
else // 最后用单else兜底
{
cout << "else" << endl;
}
1.2 do...while(0)形式的宏
#define PROCESS do{cout << "process" << endl; cout << "test" << endl;}while(0)
#define PROCESS1 cout << "process" << endl; cout << "test" << endl; // 多条语句
#define PROCESS2 {cout << "process" << endl; cout << "test" << endl;} //和条件语句冲突
bool flag = true;
if(flag)
PROCESS1; // 打印 process test
bool flag = false;
if(flag)
PROCESS1; // 打印test,因为宏PROCESS1替换后,是两条语句,所以即便if不成立,也会执行后面那条
bool flag = false;
if(flag)
PROCESS2; // 打印 process test
bool flag = false;
if(flag)
PROCESS2;
else /* 这里会报错,因为if...else if...else...语句没结束的话{}后面是不能加分号的,但PROCESS2后面如果不加分号,就不符合宏调用的格式 */
cout << "else" << endl;
bool flag = false;
if(flag)
PROCESS; // 因为是while(0),所以执行一个do,后面就退出了,只执行一次
else
cout << "else" << endl;
2.逻辑表达式与短路问题
逻辑运算符 && || !
int m = 10;
int n = 20;
if(m == 10 || n == 44)
{
cout << "m == 10 || n == 20" << endl; // m == 10 || n == 20
}
if(!(m > 10)) // 相当于 m <= 10
{
cout << "!(m > 10)" << endl; // !(m > 10)
}
if(m == 10 || (cout << "abc" << endl,n == 44)) /* 不会输出‘abc’,表达式短路,只要逻辑运算符前面的表达式能决定整个表达式的最终值,那逻辑运算符后面的表达式就不会再运算了 */
{
cout << "m == 10 || n == 20" << endl; // m == 10 || n == 20
}
if(m == 30 && (cout << "abc" << endl,n == 44)) // 不会输出‘abc’,短路
{
cout << "m == 10 || n == 20" << endl; // m == 10 || n == 20
}
举例:使用短路特性为程序‘上保险’,myClass如果为空的话,myClass.process()就会抛出异常,为了避免程序抛出异常,可以这样写:
MyClass *myClass;
if(myClass != NULL && myClass.process()) /* 如果myClass为空,逻辑与前面为假,后面短路,防止了程序报错,如果myClass非空,则myClass.process()正常执行 */
{
... ...
}
3.处理字符的函数集:cctype
#include <iostream>
#include <cctype> // 声明头文件
using namespace std;
int main(int argc, const char * argv[]) {
char c1 = 'a';
char c2 = '5';
char c3 = 'A';
if(isalpha(c1)) // 判断 c1 是否为字符
{
cout << "c1 is an alpha." << endl; // c1 is an alpha.
}
if(isalnum(c2)) // 判断 C2 是否为数字
{
cout << "c2 is a num." << endl; // c2 is a num.
}
if(isupper(c3)) // 判断 C3 是否为大写
{
cout << "c3 is a upper alpha." << endl; // c3 is a upper alpha.
}
c3 = tolower(c3); // 转换为小写
cout << "c3 = " << c3 << endl; // a
return 0;
}
4.问号 (?) 操作符
// 三元操作符 (condition)?value1:value2
int m = 3;
int n = 6;
string s = (m < n)?"hello":"world";
cout << "s = " << s << endl; // s = hello
// 问号表达式的分解
if(m < n)
{
s = "hello";
}
else
{
s = "world";
}
// 稍微复杂些的语句,问号表达式能表示吗?
if(m == n)
{
s = "m == n";
}
else if(m < n)
{
s = "m < n";
}
else
{
s = "m > n";
}
// 用问号表达式表示上述条件语句
s = (m == n)?"m == n":(m < n)?"m < n":"m > n"; // 用两次问号操作符实现复杂条件语句
cout << s << endl; // m < n
// 更加复杂的条件语句,问号表达式能表示吗?
if(m < n)
{
if(m == 3)
{
s = "m < n && m == 3";
}
else
{
s = "m < n && m != 3";
}
}
else
{
s = "m >= n";
}
// 遇到if就加问号(?),遇到else就加冒号(:)
s = (m < n)?((m == 3)?"m < n && m == 3":"m < n && m != 3"):"m >= n";
cout << "s = " << s << endl;
// 带有其他操作的条件语句也能用问号表示
if(m < n)
{
if(m == 3)
{
int i = 20;
i++;
i+=i*i;
cout << " i = " << i << endl;
s = "m < n && m == 3";
}
else
{
s = "m < n && m != 3";
}
}
else
{
s = "m >= n";
}
int i = 20; // 定义语句不能放在问号表达式后面,要单独拿出来
s = (m < n)?((m == 3)?(i++, i+=i*i,cout << " i = " << i << endl, "m < n && m == 3"):"m < n && m != 3"):"m >= n";
cout << "s = " << s << endl;
5.条件语句:switch
5.1 switch的基本语法和规则
// 多分支条件语句
int m = 2;
if(m == 1)
{
cout << "m == 1" << endl;
}
else if(m == 2)
{
cout << "m == 2" << endl; // m == 2
}
else if(m == 3)
{
cout << "m == 3" << endl;
}
else
{
cout << "m是其他值." << endl;
}
// switch 语句 ,default相当于else,用来兜底
switch (m) {
case 1:
cout << "m == 1" << endl;
break; /* switch语句进入一个case执行完之后,不会自动跳出,而是会按顺序执行下一个case,所以这里要用到break跳出switch */
case 2:
cout << "m == 2" << endl;
break;
case 3:
cout << "m == 3" << endl;
break;
default:
cout << "m是其他值." << endl;
break;
}
5.2 switch(expression)中expression的限制
// 布尔类型可以用于switch,不能返回整数值的变量(如:float),不能用于switch
bool flag = true;
switch (flag) {
case true:
break;
default:
break;
}
5.3 在switch语句中使用枚举类型和布尔类型
enum {ONE = 1, TWO = 2, THREE} num1; // num1的取值可能是ONE,TWO,THREE中的一个
int k = 2;
switch (k) {
case ONE: /* 相当于1 */
break;
case TWO: /* 相当于2 */
break;
case THREE:
break;
default:
break;
}
num1 = THREE;
switch (num1) {
case ONE:
break;
case THREE:
break;
default:
break;
}
5.4 用switch实现或的逻辑关系
if(2 == m || 3 == m) // 将常量写到前面,可以避免少写一个等号
{
cout << "abc" << endl;
}
// 用switch语句表示逻辑或
switch (m) {
case 2:
// 把这里的break去掉,就可以实现逻辑或
case 3:
cout << "abc" << endl;
break;
default:
break;
}