为什么void会返回一个值?

5
我不明白一个奇怪的问题。这是我的程序:
#include <iostream>
using namespace std;

void Swap(int *a , int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int a=0;
    int b=0;

    cout<<"Please enter integer A: ";
    cin>>a;

    cout<<"Please enter integer B: ";
    cin>>b;

    cout<<endl;

    cout<<"************Before Swap************\n";
    cout<<"Value of A ="<<a<<endl;
    cout<<"Value of B ="<<b<<endl;

    Swap (&a , &b);

    cout<<endl;

    cout<<"************After Swap*************\n";
    cout<<"Value of A ="<<a<<endl;
    cout<<"Value of B ="<<b<<endl;

    return 0;
}

现在如果你看一下函数"Swap",我使用了"void Swap"。因此它不会向主函数返回任何值(只有“int”会返回一个值(至少这是我的老师教我的))。但是如果你执行它,主函数的值却被交换了!怎么可能?有人能告诉我它是如何实现的吗?


1
请确保您理解“按值传递”和“按引用传递”的区别。 - CodeMonkey
在C++中,return有特定的含义。如果Swap语句中写了return temp;(例如),那么就会返回一个值,而这在void函数中是不允许的。Swap函数所做的是通过指针修改传递给它的变量。这是完全可以的。 - john
“只有“int”返回值”- 实际上正相反。只有void不返回任何值,其他所有类型都会返回。 - MSalters
7个回答

6

你例子中的Swap函数只是交换了两个整数,但没有返回任何东西。

为了确定函数返回了什么,你需要将其赋值给某个变量,像这样:

int a = swap(&a, &b);

但是这段代码有一个错误,因为交换函数没有返回任何东西。

另一个例子:

int func() {
    return 18;
}

int main() {
    int a =  func();
    cout << a;
}

很好,因为变量a是整数类型,函数func返回一个整数。


1
谢谢您的解释,非常有帮助。 - Silver Falcon
if(function())怎么样?我没有将函数的返回值赋值,但是我会检查它。 - Bartlomiej Lewandowski
如果function()的返回类型是void,则代码将无法编译。当且仅当function() == 0时,@BartlomiejLewandowski function() == false。否则,function() == true。 - Dima

2

Swap 可能不会返回任何值,但它仍然可以修改它们。你将两个变量的指针传递到函数中。如果你在 Swap 函数中更改指针映射到的值,该更改将在整个程序中持续存在。


啊,谢谢您的纠正。我现在会在我的回答中进行更正。 - Zach Latta

1

我认为你误解了你的老师所说的。

他/她说的可能是Swap()函数不会返回值,但通过传递地址来改变值仍然是有效的。

就像这样:

int Swap();
int GetReturnValue = Swap(); // Get return value from Swap()

让我们看看第二个:
void Swap();
int GetReturnValue = Swap();

尽管第二个可能确实会得到价值,但这个价值是无意义的。
有时,如果你像第二个那样做,你会收到编译器警告,GCC编译器会报告有关强制转换的警告。

1

这是正确的。

你的Swap方法使用指针而不是实际值进行操作。

在主函数中,你调用了这个方法,并告诉它交换变量中的值。此时它们处于相同的上下文中。


1

1

交换过程只能修改您传递的变量,因为它们是按引用传递的。

请记住,与函数不同,过程无法返回值。


1
实际上,该函数并未返回值。它只是通过变量地址访问值并从其引用中交换它们。您的代码是正确的,现在我已经清楚地解释了您的概念,没有任何冗长的解释。就这样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接