这是我的代码:
while( Func(x) != ERR_D)
{
if(result == ERR_A)
throw...;
if(result == ERR_B)
throw...;
mydata.x = x;
}
问题是我想在while条件中使用result = Func(x)
,因为结果将在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)
,它不起作用。有什么想法可以解决这个问题吗?
答案 0 :(得分:8)
您只需要添加一些括号:
while((result = Func(x)) != ERR_D) { /* ... */ }
!=
运算符的优先级高于赋值,因此您需要先强制编译器执行赋值(在C#中计算赋值),然后再比较两侧的值。 !=
运营商彼此。这是您经常看到的模式,例如读取文件:
string line;
while ((line = streamReader.ReadLine()) != null) { /* ... */ }
答案 1 :(得分: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);
}
答案 2 :(得分: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_D
与!=
进行比较。
答案 3 :(得分:1)
尝试
while((result = Func(x)) != ERR_D)
答案 4 :(得分:0)
您可以使用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;
}
这是一个带一个循环的循环(如果忽略抛出;)),所以它是一个结构化循环。
你也可以使用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;
}