第一次作业已完成,然而有一些疑问。
首先是一些语法上的小问题。对于作业中出现的for(char ch: first+last)循环,我第一次看到for循环的这种用法。相当于对一个数组进行循环,让冒号前面的变量按照索引的顺序,依次等于数组中的值吗?first+last是两个字符串相加,那么这里面的加号已经不是数学意义上的加法,也就是改变了含义,可以猜想可能是链接两个字符串的符号。其实我一开始猜的是两个字符串按照字符顺序依次把ascii码相加,但是这样解释不通,所以感觉这样猜的不对。
然后是断点的应用。在实际数值计算的应用中,如果需要让计算的某个变量等于Nan时,即出现程序计算问题时,某处的断点生效,程序停下来。其余时刻,断点失效,程序可以连续运转。这样的附加条件的断点怎么弄?
first + last是一个新的string变量,字符串(string)可以看成是字符(char)数组。
能发现问题非常好!第一次作业不要求理解这些代码,后续两三节课就会自然而然看懂这些了。
这里的 first 和 last 都是 C++ 中 string 类的对象实例,区别于 C 语言中的数组。这里的 + 也不是数学意义上的加号,而是一种操作符,仅仅是把两个字符串拼接成一个字符串。
在 C 语言中,如果使用 + 拼接两个字符串,是不可以的。C++ 为了方便字符串的操作,封装了(抽象了)string 这个类型,把拼接字符串的底层操作(字符数组),用一个 + 操作符解决了,大大提高了编程效率。
参考以下代码:
// 执行前:
// first -> "hao"
// last -> "xue"
first = first + last
// 执行后:
// first -> "haoxue"
// last -> "xue"
调试的问题描述不太清楚,加断点打开调试器后,可以单步执行,这个手册写的很清楚了。如果想在调试过程中,让断点失效,那么取消断点就可以了。也就是说,调试过程中,也可以随意设置断点,并不是说非要在打开调试器之前。
编程要多尝试,不用担心把软件搞奔溃,实在不行就删了重来,不要有恐惧的心理。这门课,我们是可以把 C++ 当成 Python 来学的,这门课的知识点也可以用任何语言来重写,并不局限于 C++。
浮点数有 trap。根据你的编译器可以选择特定的函数引发。
以 VS 2019 为例:
cpp 代码
#include <stdio.h>
#include <float.h>
#pragma fenv_access (on)
int main()
{
_clearfp();
unsigned int control_word;
// Show original FP control word and do calculation.
_controlfp_s(&control_word, 0, 0);
printf("Original:\t0x%.4x\n", control_word);
printf("0.0/0.0=%g\n", 0.0 / 0.0);
// catch NaN
_controlfp_s(&control_word, ~_EM_INVALID, _MCW_EM);
printf("catch NaN:\t0x%.4x\n", control_word);
printf("0.0/0.0=%g\n", 0.0 / 0.0);
printf("end\n");
}
VS 2019 设置
非必须,但文档推荐这样设置
- debug 模式
- 无优化 (
Od
) - 开启浮点异常捕获
debug 开启很简单,略过。
无优化需要在项目属性中开启:
方便起见可以为debug模式下的“所有平台”都开启。

新用户只让放一张图。等过一段时间再改回来
开启浮点捕获异常是为了在 IDE 中自动进入调试模式:
-
打开异常设置窗口

-
选择捕获所需的异常,这里是 NAN——无效的浮点操作。
从异常名称来看,除了 NaN,除零、上溢、下溢、不精确表示,都可以通过设置 flag 然后捕获。

设置完毕运行程序即可:
ref
注意:第一个参考链接是 2012 年的答案,建议通过函数名,查找最新的用法。
以上 VS 2019 版本的用法,也是我在查阅微软文档后重新编写的。
https://stackoverflow.com/questions/9619014/trapping-quiet-nan
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/controlfp-s?view=msvc-170
https://cklutz.github.io/2019/10/03/fun-with-nan/