将增量运算符应用于函数

时间:2012-02-25 10:09:37

标签: c++

是否存在有效的C ++代码?

int main()
{
    int k = 0;
    ++f(k);
}

7 个答案:

答案 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;,例如。