为什么函数定义foo(int i + = 1)不可能?

时间:2013-10-21 22:01:47

标签: c++ function arguments

在功能

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;
}

此处ij都有默认参数,然后调用:

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

不可能吗?是否难以表示此定义或调用会导致一些问题?我想知道。

2 个答案:

答案 0 :(得分:6)

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

// huh?
int i += 12;

i从来没有一个值,所以加入它是没有意义的。

答案 1 :(得分: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;
}