好吧,我在学习c++的过程中,我在使用一个教程时遇到了一个奇怪的效果,我不太明白它是怎么发生的。
对于本教程(从提供的示例复制),我在类模板专门化中编写了一个函数,该函数检查字符是否为小写,然后将其改为大写:
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,和预期的一样。然而,如果我调用的值是'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)?
这是每个设计,if
只接受一个语句,大括号使一个块语句。
如果你想要缩进作用域,使用Python。
您的代码的问题是,当if
语句不匹配时,您不返回任何东西,这会导致未定义的行为。你的编译器可能会给你一个警告。不要忽略编译器的警告。
第二段代码实际上是你想要的,当你的if
匹配时,只改变变量element
,但总是返回变量element
。
在第一种情况下,如果不满足条件,则不执行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;
};
您有一个if语句。如果语句的计算结果为true,它将执行紧跟其后的操作。为了一次执行多个操作,必须将它们用花括号括起来。
你得到一个奇怪的答案,因为如果J 是大写,你的if语句是假的,你跳过大括号,你没有指定的返回值(因此无意义的返回值)。如果if语句不为真,则需要说明返回什么。
第二段代码可以工作,因为只有if语句后的第一行是由if控制的。这实际上是你的幸运-如果你想做两个操作,你仍然会得到垃圾。因此,通过将if语句置于花括号中来显式指定要执行的代码通常是一种良好的实践,即使它只是一个操作。