-2

在函数中

int foo(int i, int j)
{
    return i + j;
}

两者ij都未初始化,因此可以使用并且仅使用两个参数调用此函数:

foo(5, 6); // 11

好的,但是 C++ 具有默认参数,并且可以定义如下:

int foo(int i = 1, int j = 2)
{
    return i + j;
}

这里两者i都有j默认参数,然后调用:

foo(5, 6); // 11
foo(5); // 7
foo(); // 3

是可能的。那么,为什么要这样定义:

int foo(int i += 1, int j += 2)
{
    return i + j;
}

这些电话:

foo(5, 6); // 14
foo(5); // 8
foo(); // 3

是不可能的?很难表示这个定义还是调用会导致一些问题?我想知道。

4

2 回答 2

6

因为没有意义。分配一个值是一回事,增加一个预先存在的值是另一回事。您希望i这个(无效)代码段中的值是什么?

// huh?
int i += 12;

i从来没有价值,所以添加它是没有意义的。

于 2013-10-21T22:04:33.913 回答
3

声明(有或没有初始化器)和赋值是不同的东西,即使在语法上有一些相似之处。

这个:

int i;

声明一个i类型的变量int。这个:

int i = 42;

做同样的事情并指定它的初始值42

这个:

i = 42;

看起来很像带有初始化程序的声明,但它将值分配给必须先前已声明42现有变量。这个:

i += 42;

复合赋值,本质上等同于i = i + 42;.

初始化类似于简单赋值,而不是复合赋值。初始化程序通过提供要评估并存储在变量中的表达式来指定变量的初始值。在这种情况下,您不能只使用任意表达式和语句。

如果你想要一个参数的值比作为参数传递的值大 2,你可以在函数中这样做:

int foo(int i, int j)
{
    i ++;
    j += 2;
    return i + j;
}

尽管这种情况更清楚,更简单地写成:

int foo(int i, int j)
{
    return i + j + 3;
}
于 2013-10-21T22:12:00.960 回答