0

好的,所以我正在学习 C++,在使用其中一个教程时我遇到了一个奇怪的效果,而在它发生的时候我不太明白..

对于本教程(从提供的示例中复制),我在类模板特化中编写了一个函数,用于检查 char 是否为小写,然后将其变为大写:

char uppercase ()
{
    //checks to see if "element"(char) is a lower-case letter between 'a' and 'z'
    if ((element >= 'a') && (element <= 'z'))
    {
        //changes value of "element" to be element + (value of A - Value of a)[-32]
        element += 'A' - 'a'; //element = element + -32
        return element;
    };
};

现在,奇怪的是..即使 char 已经是大写的,这段代码仍然会被触发。因此,如果我调用值为“j”的函数,我显然会得到“J”,正如预期的那样。但是,如果我用“J”的值调用,该函数仍然会通过.. 所以不是函数没有改变任何东西,而是返回“*”。

现在,有趣的是.. 如果我从 if 语句中删除括号,它会按预期工作。所以,随着

char uppercase ()
{
    //checks to see if "element"(char) is a lower-case letter between 'a' and 'z'
    if ((element >= 'a') && (element <= 'z'))
        //changes value of "element" to be element + (value of A - Value of a)[-32]
        element += 'A' - 'a'; //element = element + -32
        return element;
};

它完全按预期工作。调用值为“J”的函数只返回“J”,因为不满足条件,因此没有执行任何代码。现在,我知道大括号对于 if 语句是可选的,但本教程说,不止一个语句需要大括号。

还值得注意的是,使用带有简单返回的大括号向语句添加 else 会产生预期的效果,但这应该是不必要的,对吧?

所以,基本上..我错过了一些关于大括号的东西,还是这只是编译器的问题(Visual Studio 2012)?

4

3 回答 3

3

这是根据设计,if仅接受一个语句,大括号构成一个块语句。

如果你想要缩进范围,请使用 Python。

if您的代码的问题是,当语句不匹配时,您不会返回任何内容,这会导致未定义的行为。你的编译器可能会给你一个警告。不要忽略编译器警告。

第二块代码实际上是你想要的,只element在你if匹配时改变变量,但总是返回变量element

于 2013-03-25T05:04:50.803 回答
2

在第一种情况下,return如果不满足条件,则不会执行语句。大概该函数正在返回垃圾。

在第二种情况下,因为没有大括号,所以只有一行取决于条件。无论如何都会执行该return语句。换句话说,您的第二个示例等效于:

char uppercase ()
{
    //checks to see if "element"(char) is a lower-case letter between 'a' and 'z'
    if ((element >= 'a') && (element <= 'z'))
    {
        //changes value of "element" to be element + (value of A - Value of a)[-32]
        element += 'A' - 'a'; //element = element + -32
    }
    return element;
};
于 2013-03-25T05:08:34.097 回答
0

你有一个 if 语句。如果该语句的计算结果为真,它将立即执行紧随其后的操作。为了一次执行多个操作,您必须将它们括在花括号中。

你会得到一个奇怪的大括号答案,因为如果 J大写的,你的 if 语句是假的,你跳过大括号,并且你没有指定的返回值(因此是无意义的返回值)。如果您的 if 语句不正确,您需要说明要返回的内容。

您的第二段代码有效,因为只有 if 语句后的第一行由 if 控制。这基本上是你在这里很幸运 - 如果你有两个你想做的操作,你仍然会得到垃圾。因此,通常最好通过将 if 语句放在花括号中来明确指定要由 if 语句执行的代码,即使它是一个操作也是如此。

于 2013-03-25T05:08:04.143 回答