5

这是我的代码:

while( Func(x) != ERR_D)
{
   if(result == ERR_A) 
         throw...; 
   if(result == ERR_B)
         throw...;

  mydata.x = x;
 }

问题是我想result = Func(x)在 while 条件中使用,因为结果将在 while 循环内检查。while 循环应该调用Func(x)直到它返回ERR_D。我无法使用

do{ 
    result = Func(x);
   if(result == ERR_A) 
         throw ...; 
   if(result == ERR_B)
         throw ...;
    mydata.x = x;
   }while(result != ERR_D); 

在我的项目中,因为它首先调用Func(x)的是我不想要的。但是我试过while(result = Func(x) != ERR_D)了,还是不行。有什么想法可以解决这个问题吗?

4

5 回答 5

8

您只需要添加一些括号:

while((result = Func(x)) != ERR_D) { /* ... */ }

运算符的!=优先级高于赋值,因此您需要强制编译器先执行赋值(在 C# 中计算为赋值的值),然后再将运算符两侧的值!=相互比较。这是您经常看到的模式,例如读取文件:

string line;

while ((line = streamReader.ReadLine()) != null) { /* ... */ }
于 2013-09-24T09:02:00.710 回答
6

尝试result在循环外声明,然后Funcs在每次迭代时为其分配返回值。

例如:

var result = Func(x);

while(result != ERR_D)
{
   if(result == ERR_A) 
         throw...; 
   if(result == ERR_B)
         throw...;

  mydata.x = x;
  result = Func(x);
 }
于 2013-09-24T08:59:21.570 回答
2

尝试这个:

while((result=Func(x)) != ERR_D){
 if(result == ERR_A) 
      throw...; 
 if(result == ERR_B)
      throw...;
 mydata.x = x;
}

注意:赋值首先在括号中完成(result=Func(x)),这个赋值实际上是通过运算符的重载完成的=,这个运算符返回对左侧操作数的引用,即result. 之后,result将与ERR_Dvia 运算符进行比较!=

于 2013-09-24T08:58:22.437 回答
1

尝试

while((result = Func(x)) != ERR_D)
于 2013-09-24T09:00:10.870 回答
0

您可以使用 a 来表达这一点while (true)...

while (true)
{
    var result = Func(x);

    if (result == ERR_D)
        break;

    if (result == ERR_A) 
        throw ...; 

    if (result == ERR_B)
        throw ...;

    mydata.x = x;            
}

这是一个有一个退出的循环(如果你忽略了 throws ;))所以它是一个结构化的循环。

你也可以使用for循环,虽然它看起来有点时髦(双关语不是故意的!):

for (var result = Func(x); result != ERR_D; result = Func(x))
{
    if (result == ERR_A) 
        throw ...; 

    if (result == ERR_B)
        throw ...;

    mydata.x = x;     
}
于 2013-09-24T09:08:18.170 回答