第6章 分支语句和逻辑运算符
本章内容
- if语句
- if-else-if阶梯
- 条件运算符(三元运算符)
- switch语句
- break和continue在switch中的使用
- 逻辑运算符详解
- 文件I/O基础
6.1 if语句
6.1.1 基本结构
cpp
if (条件) {
// 条件为true时执行
}6.1.2 基本示例
cpp
#include <iostream>
using namespace std;
int main()
{
int age;
cout << "Enter your age: ";
cin >> age;
if (age >= 18) {
cout << "You are an adult." << endl;
}
if (age < 13) {
cout << "You are a child." << endl;
}
return 0;
}6.1.3 if语句的缩进
cpp
// 正确的缩进
if (age >= 18)
{
cout << "Adult" << endl;
}
// 错误的缩进(不影响编译,但影响可读性)
if (age >= 18)
cout << "Adult" << endl;6.2 if-else语句
6.2.1 基本结构
cpp
if (条件) {
// 条件为true时执行
} else {
// 条件为false时执行
}6.2.2 基本示例
cpp
#include <iostream>
using namespace std;
int main()
{
int score;
cout << "Enter your score: ";
cin >> score;
if (score >= 60) {
cout << "Pass" << endl;
} else {
cout << "Fail" << endl;
}
return 0;
}6.3 if-else-if阶梯
6.3.1 基本结构
cpp
if (条件1) {
// 条件1为true
} else if (条件2) {
// 条件1为false,条件2为true
} else if (条件3) {
// 条件1和2为false,条件3为true
} else {
// 所有条件都为false
}6.3.2 基本示例
cpp
#include <iostream>
using namespace std;
int main()
{
int score;
cout << "Enter score (0-100): ";
cin >> score;
if (score >= 90) {
cout << "Grade: A" << endl;
} else if (score >= 80) {
cout << "Grade: B" << endl;
} else if (score >= 70) {
cout << "Grade: C" << endl;
} else if (score >= 60) {
cout << "Grade: D" << endl;
} else {
cout << "Grade: F" << endl;
}
return 0;
}6.3.3 注意事项
cpp
// 条件顺序很重要
if (score >= 60) {
cout << "D or better" << endl;
} else if (score >= 90) { // 永远不会执行
cout << "A" << endl;
}
// 正确的顺序
if (score >= 90) {
cout << "A" << endl;
} else if (score >= 60) {
cout << "D or better" << endl;
}6.4 条件运算符(三元运算符)
6.4.1 基本语法
cpp
条件 ? 表达式1 : 表达式2;6.4.2 基本示例
cpp
#include <iostream>
using namespace std;
int main()
{
int a = 10, b = 20;
// 传统方式
int max;
if (a > b) {
max = a;
} else {
max = b;
}
// 条件运算符
int max2 = (a > b) ? a : b;
cout << "Max: " << max2 << endl;
// 条件运算符可以嵌套(不推荐)
int x = 15;
string result = (x > 10) ? "大于10" : (x > 5) ? "大于5" : "其他";
cout << result << endl;
return 0;
}6.5 switch语句
6.5.1 基本结构
cpp
switch (表达式) {
case 常量1:
// 语句
break;
case 常量2:
// 语句
break;
default:
// 默认语句
}6.5.2 基本示例
cpp
#include <iostream>
using namespace std;
int main()
{
int day;
cout << "Enter day (1-7): ";
cin >> day;
switch (day) {
case 1:
cout << "Monday" << endl;
break;
case 2:
cout << "Tuesday" << endl;
break;
case 3:
cout << "Wednesday" << endl;
break;
case 4:
cout << "Thursday" << endl;
break;
case 5:
cout << "Friday" << endl;
break;
case 6:
cout << "Saturday" << endl;
break;
case 7:
cout << "Sunday" << endl;
break;
default:
cout << "Invalid day" << endl;
}
return 0;
}6.5.3 switch的注意事项
cpp
// case必须是常量表达式
int x = 5;
switch (x) {
case 5: // 正确:字面量
break;
case y: // 错误:变量
break;
}
// 忘记break会导致穿透
switch (choice) {
case 1:
cout << "One" << endl;
// 没有break,会继续执行下一个case
case 2:
cout << "Two" << endl;
break;
}6.6 break和continue在switch中的使用
6.6.1 break的作用
cpp
switch (choice) {
case 1:
cout << "One" << endl;
break; // 跳出switch语句
case 2:
cout << "Two" << endl;
break;
default:
cout << "Other" << endl;
break;
}6.6.2 穿透(fall-through)
cpp
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
cout << "31 days" << endl;
break;
case 4: case 6: case 9: case 11:
cout << "30 days" << endl;
break;
case 2:
cout << "28 or 29 days" << endl;
break;
}6.6.3 continue在switch中的行为
cpp
// continue在switch中没有实际作用
// switch不是循环,continue会导致编译错误
// 正确做法:使用if-else或重新组织代码
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
cout << i << " ";
}6.7 逻辑运算符详解
6.7.1 逻辑与(&&)
cpp
// 两个条件都为true时才为true
bool result = (a > 0) && (b > 0);
// 短路求值
if (ptr != nullptr && *ptr > 0) {
// ptr不为空时才会解引用
}6.7.2 逻辑或(||)
cpp
// 至少一个条件为true时就为true
bool result = (a > 0) || (b > 0);
// 短路求值
if (i >= 0 || array[i] > 0) {
// i为负数时不会访问数组
}6.7.3 逻辑非(!)
cpp
// 取反
bool result = !(a > b); // 等价于 a <= b
if (!found) {
cout << "Not found" << endl;
}6.7.4 逻辑运算符优先级
cpp
// &&优先级高于||
// !优先级最高
bool result = !a && b || c;
// 等价于:((!a) && b) || c6.7.5 使用逻辑运算符的技巧
cpp
// 范围检查
if (x >= 0 && x <= 100) {
cout << "Valid range" << endl;
}
// 默认值
int value = (ptr != nullptr) ? *ptr : 0;
// 条件组合
if (isValid && (isAdmin || isOwner)) {
grantAccess();
}6.8 文件I/O
6.8.1 包含头文件
cpp
#include <fstream> // 文件输入输出
#include <iostream>
using namespace std;6.8.2 写入文件
cpp
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream outFile; // 输出文件流
outFile.open("output.txt"); // 打开文件
if (outFile.is_open()) {
outFile << "Hello, File!" << endl;
outFile << "Number: " << 42 << endl;
outFile.close(); // 关闭文件
cout << "File written successfully" << endl;
} else {
cout << "Unable to open file" << endl;
}
return 0;
}6.8.3 读取文件
cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ifstream inFile; // 输入文件流
inFile.open("input.txt"); // 打开文件
if (inFile.is_open()) {
string line;
while (getline(inFile, line)) {
cout << line << endl;
}
inFile.close(); // 关闭文件
} else {
cout << "Unable to open file" << endl;
}
return 0;
}6.8.4 文件I/O示例
cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
// 写入文件
ofstream outFile("students.txt");
outFile << "Alice 20 3.8" << endl;
outFile << "Bob 22 3.5" << endl;
outFile << "Charlie 21 3.9" << endl;
outFile.close();
// 读取文件
ifstream inFile("students.txt");
string name;
int age;
double gpa;
while (inFile >> name >> age >> gpa) {
cout << name << " " << age << " " << gpa << endl;
}
inFile.close();
return 0;
}6.9 字符输入
6.9.1 cin.get()
cpp
#include <iostream>
using namespace std;
int main()
{
char ch;
cout << "Enter a character: ";
ch = cin.get(); // 读取一个字符,包括空白
cout << "You entered: " << ch << endl;
return 0;
}6.9.2 EOF检测
cpp
#include <iostream>
using namespace std;
int main()
{
char ch;
int count = 0;
cout << "Enter text (Ctrl+Z on Windows, Ctrl+D on Unix to end): ";
while ((ch = cin.get()) != EOF) {
count++;
cout << ch;
}
cout << endl << "Characters entered: " << count << endl;
return 0;
}6.10 嵌套if和switch
6.10.1 嵌套if
cpp
#include <iostream>
using namespace std;
int main()
{
int age;
bool hasTicket;
cout << "Enter age: ";
cin >> age;
cout << "Do you have a ticket? (1=yes, 0=no): ";
cin >> hasTicket;
if (age >= 18) {
if (hasTicket) {
cout << "Welcome!" << endl;
} else {
cout << "Please buy a ticket." << endl;
}
} else {
cout << "Sorry, you must be 18 or older." << endl;
}
return 0;
}6.10.2 switch嵌套
cpp
#include <iostream>
using namespace std;
int main()
{
int choice;
cout << "1. Math" << endl;
cout << "2. Science" << endl;
cout << "3. History" << endl;
cout << "Enter choice: ";
cin >> choice;
switch (choice) {
case 1:
cout << "Math selected" << endl;
int mathChoice;
cout << "1. Algebra" << endl;
cout << "2. Geometry" << endl;
cout << "Enter math topic: ";
cin >> mathChoice;
switch (mathChoice) {
case 1:
cout << "Algebra selected" << endl;
break;
case 2:
cout << "Geometry selected" << endl;
break;
default:
cout << "Invalid choice" << endl;
}
break;
case 2:
cout << "Science selected" << endl;
break;
case 3:
cout << "History selected" << endl;
break;
default:
cout << "Invalid choice" << endl;
}
return 0;
}6.11 总结
- if语句用于条件执行
- if-else-if阶梯用于多条件判断
- 条件运算符是if-else的简写形式
- switch语句用于基于整数值的分支
- break防止switch穿透
- 逻辑运算符组合多个条件
- 文件I/O使用ifstream和ofstream
- 字符输入可以使用cin.get()
- 嵌套结构可以处理复杂逻辑