4. 字符串 (String) 与 表达式 (Expression)
** **
4.1 概念介绍
- 字符串 (String):由零个或多个字符组成的序列,通常用来表示文本。在C++中,字符串被双引号
"包围。 - 表达式 (Expression) :由运算符、常量、变量、函数调用等组合而成的、能够计算出一个值的式子。例如,
5 + 3是一个表达式,其计算结果是8。
4.2 算法步骤
使用字符串:
- 包含头文件:要使用C++标准字符串类
std::string,需要包含头文件<string>。 - 定义字符串变量:
std::string myString = "Hello"; - 操作字符串:可以使用
+进行拼接,或使用其成员函数进行各种操作。
构建表达式:
- 确定操作数:选择要参与运算的变量、常量或字面值。
- 选择运算符:根据需要选择算术运算符(
+,-,*,/,%)、关系运算符(>,<,==)、逻辑运算符(&&,||,!)等。 - 组合:将操作数和运算符按语法规则组合起来。
- 求值:编译器/程序会根据运算符的优先级和结合性计算表达式的结果。
4.3 算法可视化SVG图示
** **
4.4 核心特性
- 字符串:
-
- 动态长度:
std::string的长度可以根据内容动态变化。 - 丰富的操作:提供了查找、替换、拼接、截取等多种功能。
- 动态长度:
- 表达式:
-
- 有值性:任何表达式都有一个计算结果(值),这个值也有其类型。
- 副作用:某些表达式除了产生值外,还会改变变量的状态,如
x++。 - 优先级和结合性:运算符有不同的优先级(如乘法优先于加法),相同优先级的运算符有结合性(如
a-b-c从左到右计算)。
2.5 C++代码基础实现
#include <iostream>
#include <string> // 必须包含 string 头文件
int main() {
// ---- 字符串 ----
std::string firstName = "Lihua";
std::string lastName = "Wang";
// 字符串拼接
std::string fullName = firstName + " " + lastName;
std::cout << "Full Name: " << fullName << std::endl;
// ---- 表达式 ----
int a = 10;
int b = 5;
int c = 2;
// 算术表达式
int result1 = a + b * c; // 结果是 10 + (5 * 2) = 20
std::cout << "a + b * c = " << result1 << std::endl;
// 关系表达式,其结果是布尔值 (true 或 false)
bool isGreater = (a > b); // 结果是 true
std::cout << "Is a > b? " << std::boolalpha << isGreater << std::endl; // std::boolalpha 使输出为 true/false
// 赋值表达式
// 整个表达式 (c = a + b) 的值是赋给c的值,即15
int d = (c = a + b);
std::cout << "c is " << c << ", d is " << d << std::endl;
return 0;
}
2.6 优化策略
- 字符串:在大量拼接字符串时,使用
+=操作符通常比反复使用+创建新字符串更高效。 - 表达式:
-
- 使用括号:当不确定运算符优先级时,使用
()来明确计算顺序,提高代码可读性。 - 简化表达式:避免写过于复杂和冗长的表达式,可以拆分成多个步骤,用中间变量存储结果。
- 使用括号:当不确定运算符优先级时,使用
2.7 优缺点
- 字符串 (
std::string) -
- 优点:使用方便,安全,功能强大。
- 缺点:相比C风格字符数组,可能有效率开销。
- 表达式
-
- 优点:能以简洁的方式表达复杂的计算逻辑。
- 缺点:复杂的表达式可读性差,容易出错。
2.8 应用场景
- 字符串:
-
- 处理用户姓名、地址等文本信息。
- 读取或写入文件内容。
- 在程序中显示提示信息或结果。
- 表达式:
-
- 进行任何形式的数学计算。
- 在
if,while等语句中构造判断条件。 - 计算并给变量赋值。
2.9 扩展
- C风格字符串:C++也支持C语言风格的字符串,即以空字符
\0结尾的字符数组(char[])。在底层操作或与C库交互时会用到。 - 类型转换:表达式中不同类型的变量运算时,会发生隐式类型转换(如
int和double相加,int会被提升为double)。 - 短路求值:逻辑与
&&和逻辑或||运算符具有短路特性。例如,对于A && B,如果A为假,则B不会被计算。
2.10 课后配套练习
- 题目:定义两个字符串变量,分别存储你的姓和名,然后将它们拼接成一个完整的姓名(中间加一个空格),并打印出来。
-
-
C++代码实现:
#include <iostream> #include <string> int main() { std::string firstName = "San"; std::string lastName = "Zhang"; std::string fullName = lastName + " " + firstName; std::cout << fullName << std::endl; return 0; }
-
- 题目:计算表达式
(100 + 200) * 3 / 2的值并打印。 -
-
C++代码实现:
#include <iostream> int main() { int result = (100 + 200) * 3 / 2; std::cout << "Result: " << result << std::endl; // 结果是 450 return 0; }
-
- 题目:输入一个圆的半径,计算并输出它的周长和面积。圆周率取3.14。
-
-
C++代码实现:
#include <iostream> int main() { const double PI = 3.14; double radius; std::cout << "Enter the radius: "; std::cin >> radius; double circumference = 2 * PI * radius; double area = PI * radius * radius; std::cout << "Circumference: " << circumference << std::endl; std::cout << "Area: " << area << std::endl; return 0; }
-
- 题目:判断一个整数
n是否能同时被3和5整除。输出true或false。 -
-
C++代码实现:
#include <iostream> int main() { int n = 15; bool divisible = (n % 3 == 0) && (n % 5 == 0); std::cout << std::boolalpha << divisible << std::endl; return 0; }
-
- 题目:给定华氏温度
F,计算对应的摄氏温度C。转换公式为C = 5/9 * (F - 32)。注意整数除法问题。 -
-
C++代码实现:
#include <iostream> int main() { double fahrenheit = 98.6; // 必须使用 5.0 / 9.0 进行浮点数除法 double celsius = 5.0 / 9.0 * (fahrenheit - 32); std::cout << fahrenheit << " F is " << celsius << " C" << std::endl; return 0; }
-
11. 相关网络资源推荐
- cppreference.com: 最权威的C++参考手册,适合查阅关键字、标准库等详细信息。
-
- C++关键字列表
- LearnCpp.com: 非常适合初学者的免费教程网站,讲解详细,循序渐进。
-
- Chapter 1: C++ Basics
第 1 章:C++ 基础知识
- Chapter 1: C++ Basics
- cplusplus.com: 另一个流行的C++学习和参考网站。
-
- Variables and types 变量和类型
- 菜鸟教程 (runoob.com) : 中文教程,适合快速入门。
-
- C++ 基础语法