CS106B第一次作业疑问

第一次作业已完成,然而有一些疑问。
首先是一些语法上的小问题。对于作业中出现的for(char ch: first+last)循环,我第一次看到for循环的这种用法。相当于对一个数组进行循环,让冒号前面的变量按照索引的顺序,依次等于数组中的值吗?first+last是两个字符串相加,那么这里面的加号已经不是数学意义上的加法,也就是改变了含义,可以猜想可能是链接两个字符串的符号。其实我一开始猜的是两个字符串按照字符顺序依次把ascii码相加,但是这样解释不通,所以感觉这样猜的不对。
然后是断点的应用。在实际数值计算的应用中,如果需要让计算的某个变量等于Nan时,即出现程序计算问题时,某处的断点生效,程序停下来。其余时刻,断点失效,程序可以连续运转。这样的附加条件的断点怎么弄?

first + last是一个新的string变量,字符串(string)可以看成是字符(char)数组。

2 个赞

能发现问题非常好!第一次作业不要求理解这些代码,后续两三节课就会自然而然看懂这些了。

这里的 first 和 last 都是 C++ 中 string 类的对象实例,区别于 C 语言中的数组。这里的 + 也不是数学意义上的加号,而是一种操作符,仅仅是把两个字符串拼接成一个字符串。

在 C 语言中,如果使用 + 拼接两个字符串,是不可以的。C++ 为了方便字符串的操作,封装了(抽象了)string 这个类型,把拼接字符串的底层操作(字符数组),用一个 + 操作符解决了,大大提高了编程效率。

参考以下代码:

// 执行前: 
// first -> "hao"
// last -> "xue"
first = first + last
// 执行后: 
// first -> "haoxue"
// last -> "xue"

调试的问题描述不太清楚,加断点打开调试器后,可以单步执行,这个手册写的很清楚了。如果想在调试过程中,让断点失效,那么取消断点就可以了。也就是说,调试过程中,也可以随意设置断点,并不是说非要在打开调试器之前。

编程要多尝试,不用担心把软件搞奔溃,实在不行就删了重来,不要有恐惧的心理。这门课,我们是可以把 C++ 当成 Python 来学的,这门课的知识点也可以用任何语言来重写,并不局限于 C++。

4 个赞

浮点数有 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模式下的“所有平台”都开启。
![image|690x210](upload://lrdvazDehHRRVkjkJPWAZ8D1HWk.png)

新用户只让放一张图。等过一段时间再改回来

开启浮点捕获异常是为了在 IDE 中自动进入调试模式:

  1. 打开异常设置窗口
    ![image|690x160](upload://eHw9m2J7FhDvK4YqbNGwnSh0zi5.png)

  2. 选择捕获所需的异常,这里是 NAN——无效的浮点操作。
    从异常名称来看,除了 NaN,除零、上溢、下溢、不精确表示,都可以通过设置 flag 然后捕获。
    ![image|474x500](upload://vQDVvmJD15btz6Lyuzj4LYaFBfs.png)

设置完毕运行程序即可:


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/
1 个赞