是否存在有效的C ++代码?
int main()
{
int k = 0;
++f(k);
}
答案 0 :(得分:4)
是的,如果f
返回引用。
int main()
{
int k = 0;
++f(k);
}
int & f(int & k) {
return k;
}
编辑:
正如评论中所指出的,还有另一种可能性:如果++f(k)
返回一个类类型并且f
被重载为成员函数,则可以调用++operator(void)
。
答案 1 :(得分:3)
嗯,首先,如果您在该代码之前加上:
,它就会起作用#define f
但是这并没有将增量运算符应用于函数,正如您在标题中所希望的那样。如果您尝试将其应用于以下函数:
int f (int x) { return x + 1; }
你会收到错误:
error: lvalue required as increment operand
因为返回的值不是lvalue
(显然)。您可以返回对变量的引用,然后可以递增该变量:
#include <iostream>
int xyzzy = 42;
int & f(int x) { return xyzzy; }
int main() {
int k = 0;
++f(k);
std::cout << xyzzy << '\n';
return 0;
}
这是有效的,因为返回的引用引用了xyzzy
变量;它输出:
43
答案 2 :(得分:3)
函数f
将在++ pre-operator之前运行,这是由precedence of operators引起的。您没有递增函数,而是返回它返回的值。因此,只有f(k)
返回的值可以递增时,此代码才有效。
简而言之,是的,这段代码在很多情况下都是有效的(当对象f返回时不是const并且可以递增)。
答案 3 :(得分:1)
f()
可以返回从函数返回后要增加的引用。例如:
int someGlobal;
int& f(int k) {
return someGlobal;
}
虽然在很多方面[从设计角度来说]是错误的
答案 4 :(得分:1)
在显而易见的情况下,f
具有签名int f(int)
或某些等价物,不是:您不能在临时使用++
。它甚至都不会编译。
如果通过其他一些技巧(例如f
返回引用)进行编译,那么仍然存在像这样的代码是要避免的示例。
所以这一切都取决于有效的含义:它可以在编译器方面有效,但IMO在我能阅读此代码而无法选择的意义上无效关于作者的事情。
答案 5 :(得分:1)
当然:假设您想要的不仅仅是一个正方形数字:
int & square(int & n)
{
n = n * n;
return n;
}
现在你可以说,
int k;
++f(k);
,它与int k = 0 * 0 + 1;
具有相同的效果。这个例子对于0
来说并不那么令人兴奋,但总的来说是有道理的。让函数改变参数并返回对它的引用是否是好的风格是值得怀疑的,但是预增量具有相同的语义,如果你愿意,你可以写++square(++square(k))
。
答案 6 :(得分:0)
当f返回一个int&amp;,例如。