在花括号内添加语句会更改代码功能吗?

时间:2018-09-02 05:42:26

标签: c++

我对C ++还是很陌生,我正在尝试从C ++参考复制代码,以将字符串中的空格变为破折号。这是代码

void sp_to_dash(const char *str){
    while(*str){
        if(*str==' ')
            cout<<("%c", '-');

        else
            cout<<("%c", *str);
            str++;

    }
}

int main(){
    sp_to_dash("hello world how are you");
    int j;
    cin>>j;
    return 0;
}

现在这可以正常工作,我得到的输出是 输出: hello-world-how-are-you

但是,当我将sp_to_dash函数中的代码括在大括号中时

void sp_to_dash(const char *str) {
    while (*str) {
        if (*str==' ') {
            cout << ("%c", '-');
        } else {
            cout << ("%c", *str);
            str++;
        }
    }
}

我得到的输出是一个无限的破折号循环,我不明白为什么,有人可以向我解释为什么在这样的花括号中添加代码会触发无限循环吗?

2 个答案:

答案 0 :(得分:5)

缩进具有误导性。 if或else分支下只能有一个语句。要放几个,它必须是一个复合语句(花括号)。所以这个

<div class="menu">
  <div class="menu-item">Stuff</div>
  <div class="menu-item progress">
    <div class="progress-bar"></div>
    <div class="progress-value">83</div>
  </div>
  <div class="menu-item">Things</div>
</div>

...等效于此

    else
        cout<<("%c", *str);
        str++;

因此添加花括号会更改程序的控制流,这就是为什么您会得到不同的行为的原因。许多(可能是大多数)建议总是添加大括号,甚至在单个语句分支上,以供将来证明。

答案 1 :(得分:1)

az缩进可能令人困惑。如果不使用花括号,则仅执行第一行,str++不应成为分支的一部分,而是在每个循环中执行。在第二种情况下,str仅在当前字符不是'-'的地方递增,最后是正确的。

此外,它将在到达字符串末尾后继续读取内存。这个提示区域属于其他变量或其他过程,可以从您的角度将其视为随机字符。