我在试图找出为什么在我的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.
考虑一下,它必须是函数末尾返回的值,任何想法?
答案 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 variables和What'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,然后被丢弃。
全局main
已static 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。