【发布时间】:2016-08-12 13:07:49
【问题描述】:
我已经使用 C/C++ 大约三年了,我不敢相信我以前从未遇到过这个问题!
以下代码可以编译(我刚刚尝试使用 gcc):
#include <iostream>
int change_i(int i) {
int j = 8;
return j;
}
int main() {
int i = 10;
change_i(10);
std::cout << "i = " << i << std::endl;
}
而且,如您所料,程序会打印 i = 10。
我的问题是——为什么会编译?我本来预计会出现一个错误,或者至少是一个警告,说有一个未使用的值返回。
天真地,我认为这与您不小心忘记了非 void 函数中的返回调用类似。我明白它是不同的,我明白为什么这段代码本质上没有任何问题,但它似乎很危险。我刚刚在我的一些非常旧的代码中发现了一个类似的错误,代表一个可以追溯到很长时间的错误。我显然打算这样做:
i = change_i(10);
但是忘记了,所以它从来没有改变过(我知道这个例子很傻,确切的代码要复杂得多)。任何想法将不胜感激!
【问题讨论】:
-
鉴于赋值 (
=) 是一个表达式,因此对每个未使用的表达式发出警告都是有问题的。 -
参见c++17中的nodiscard attribute
-
您使用哪些选项进行编译?你在使用 -Wall 吗? gcc 还有其他标志可以打开/关闭警告。
-
旁白:通常,人们会期望一个名为
change_i的函数来更改其参数;它必须将int&作为输入,而不是int。