在没有“return(0);”的情况下调用函数后返回0

时间:2018-02-21 01:25:36

标签: c++

我在试图找出为什么在我的while循环结束时打印出零时遇到了一个小问题。

#include <iostream>
using namespace std;

int x;

int CountDown(int x);
int CountUp(int x);

int main()
{


    int toCountUp = CountUp(x);

    cout << x << endl;



}


int CountUp(int x)
{
    x = 0;
    while(x <= 10)
    {
        cout << x << endl;
        x++;
    }
}

我最好的回答是它处于while循环的状态。或者函数/ main的返回状态正在实现,但我没有返回,并且我知道函数不需要return语句但是在这个while循环中我想要返回一个整数,做我需要使函数void,所以不会返回?但是对于while循环我需要的参数x呢?

代码输出:

0
1
2
3
4
5
6
7
8
9
10
0   < ---- this is the number I do not want.  

考虑一下,它必须是函数末尾返回的值,任何想法?

4 个答案:

答案 0 :(得分:2)

这将输出值0到10:

int toCountUp = CountUp(x);

然后,输出0:

cout << x << endl;

该方法不会更改传递给它的值,它使用自己的该变量的本地副本。

答案 1 :(得分:0)

最后0打印在main()函数中,因为x被声明为全局。

如果您想要在x打印完毕后的最新main(),那么您应该引用变量并且不要全局声明它。

int CountUp(int &); /* function prototype*/

由于传递变量(实际参数)引用变量具有相同的内存因此修改将影响调用函数。

int CountUp(int &x) { /* catch with reference variable so that modification affects in calling function also */
    x = 0;
    while(x <= 10)
    {
        cout << x << endl;
        x++;
    }
}

答案 2 :(得分:0)

- 这主要是因为你正在打印 cout&lt;&lt; x&lt;&lt;结束; 两次。一旦进入 int CountUp(int x)函数本身,但又在主函数中。

- 此时可以打印任何给定的x值,但是因为你在 int CountUp(int x)函数中的While {}循环之外设置了x = 0 ,它在执行函数调用后最后打印0。

*int CountUp(int x)
{
    x = 0;
    while(x <= 10)
    {
        cout << x << endl;
        x++;
    }
}*

- 你有什么理由在函数中设置x = 0吗?因为你在函数调用中传递x作为参数,并在While {}循环中向它添加1,直到它的x <= 10?问因为你没有将x返回到main()函数。

- 如果您想使用CountDown(x)将x的结束值用于倒计时,您可能希望在调用block-

之后在main()函数中重置x = 0
*int CountUp(int x)
{
    x = 0;
    while(x <= 10)
    {
        cout << x << endl;
        x++;
    }
}*

答案 3 :(得分:0)

首先阅读Shadowing variablesWhat's the difference between passing by reference vs. passing by value?

int x的{​​{1}}参数会影响全局变量CountUp,因此在int x内,唯一的CountUp是参数。

x

int CountUp(int x) int x定义为按值传递,因此它是用于在x中调用x的{​​{1}}的副本。这个不同的CountUp最多计为10,然后被丢弃。

全局mainstatic storage duration,默认情况下已初始化为零。不要使用具有自动持续时间的变量来尝试这个技巧,因为除非它有一个有用的构造函数,否则内容是未初始化的并且它们的值是未定义的。

Sideshow问题:

具有非x返回类型必须的函数会在所有路径上返回一个值。如果没有,那么你有Undefined Behaviour并且编译器可以生成无可救药的无效代码,即使没有采用错误的路径也可以获得这些代码。不要使用未定义的行为进行smurf,因为它可能会使程序崩溃或做一些搞笑的事情,但它可能看起来有效但直到它突然没有at a really bad time

解决方案:

int x

通过引用传递void,允许全局void CountUp(int & x) { x = 0; while(x <= 10) { cout << x << endl; x++; } } 和本地x为1并且不返回任何内容。 用法是

x

在提问者的情况下没那么有用,因为它没有留下x

 CountUp(x);

如果提供的toCountUp对副本进行操作,则制作副本,然后返回int CountUp(int x) { x = 0; while(x <= 10) { cout << x << endl; x++; } return x; } 。用法是

x

并将x设置为比全局 int toCountUp = CountUp(x); 高10。