调用方法,return出来的值改变,请教高手。

zy850919 2009-04-24 10:53:11

using System;
using System.Collections.Generic;
using System.Text;

namespace Prime_Number
{
class TechniqueTow
{

static void Main(string[] args)
{
char yes = 'y';
while (yes == 'y')
{
int Dispute = 0;
Console.Write("请输入一个数:");
int Number = int.Parse(Console.ReadLine());
TechniqueTow TechniqueTowNumber = new TechniqueTow();
TechniqueTowNumber.Estimate(Dispute,Number );
if (Dispute == 1)
{
char Submultiple;
Console.WriteLine("请选择是否计算素数的因数,计算输入y,不计算输入n");
Submultiple = char.Parse(Console.ReadLine());
if (Submultiple == 'y')
TechniqueTowNumber.Submultiple(Number);
}
Console.WriteLine("请选择是否继续,继续输入y,退出输入n");
yes = char.Parse(Console.ReadLine());
}

}

public int Estimate(int Dispute, int Number)
{
int a = 0;
if (Number == 2)
a = 0;
else if (Number == 1)
a = 0;
else
{
for (int i = 2; i < Number; i++)
{
if (Number % i == 0 && a == 0)
{
Console.WriteLine("您输入的不是一个素数!");
a = 1;
Dispute = 1;
break;
}
}
}
if (a == 0)
Console.WriteLine("您输入的是一个素数!");
return Dispute;
}

private void Submultiple(int Number)
{
Console.WriteLine("--------------------");
Console.WriteLine("这个数字的因数有:");
for (int i = 2; i < Number; i++)
{
if (Number % i ==0)
Console.WriteLine("{0}",i);
}
}
}
}



编译通过,但是在运行的时候,从Estimate穿出来的Dispute值,如果是1了,但是回来main里面就在TechniqueTowNumber.Estimate(Dispute,Number )中又被还原成了0了,这是为什么?谢谢!我跟踪过,总是被还原。不知道为什么。
...全文
148 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zy850919 2009-04-24
  • 打赏
  • 举报
回复
1、一楼说的给Dispute一个变量来接受,方法可以,我试过了。谢谢
2、四楼、五楼说的前面添加ref也行,个人感觉前面加ref按引用传递。
总之两种方法都行,四楼只给了思路,五楼给了实例,平均分分数喽~~谢谢各位。呵呵
  • 打赏
  • 举报
回复
从Estimate穿出来的Dispute值,如果是1了,但是回来main里面就在TechniqueTowNumber.Estimate(Dispute,Number )中又被还原成了0了

你这个代码就像1楼那样说的,你都没字段来接受这个传回来的值,所以根本称不上有值传回,更说不上被还原了
gciyfzx07 2009-04-24
  • 打赏
  • 举报
回复
Dispute =TechniqueTowNumber.Estimate(Dispute,Number );这样附值
原因是因为参数传递时并不会改变实参的值。只是在函数内部新建了另一个int对象。
可以对
public int Estimate(ref int Dispute, int Number)这样就会改变dispute的值

ericzhangbo1982111 2009-04-24
  • 打赏
  • 举报
回复
public int Estimate(ref int Dispute, int Number)
{
int a = 0;
if (Number == 2)
a = 0;
else if (Number == 1)
a = 0;
else
{
for (int i = 2; i < Number; i++)
{
if (Number % i == 0 && a == 0)
{
Console.WriteLine("您输入的不是一个素数!");
a = 1;
Dispute = 1;
break;
}
}
}
if (a == 0)
Console.WriteLine("您输入的是一个素数!");
return Dispute;
}
  • 打赏
  • 举报
回复
你把Dispute 前面加个ref就可以了。。。。
ericzhangbo1982111 2009-04-24
  • 打赏
  • 举报
回复
从Estimate穿出来的Dispute值,如果是1了,但是回来main里面就在TechniqueTowNumber.Estimate(Dispute,Number )中又被还原成了

这句话解释下。。
jietuan 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 llsen 的回复:]
作用域问题,
主函数中你定义的Dispute = 0
然后执行到Estimate中,将Dispute = 1,然后return,但是你return的只是函数的返回值,不是把Dispute 这个值改变了
你如果想要这个值在主函数中改变
主函数中应该

C# codeDispute = TechniqueTowNumber.Estimate(Dispute,Number );
[/Quote]

正确,来晚了。
llsen 2009-04-24
  • 打赏
  • 举报
回复
作用域问题,
主函数中你定义的Dispute = 0
然后执行到Estimate中,将Dispute = 1,然后return,但是你return的只是函数的返回值,不是把Dispute 这个值改变了
你如果想要这个值在主函数中改变
主函数中应该
Dispute = TechniqueTowNumber.Estimate(Dispute,Number );

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧