2017-02-17 94 views
0

我们来考虑下面的C代码片段。奇怪状态检查

while(!var_can_be_0_or_1 && foo_returns_0_or_1(arg1, arg2)) { 
    body; 
} 

这是一个简单的条件声明,做我不明白的东西。但是让我们说我有两个宏

#define TRUE 1 
#define FALSE 0 

有人可以告诉我(或者向我解释)我们在此while循环的条件下检查什么?我的意思是在什么情况下循环体将执行以及它将跳过哪些条件?

我发现它在一本关于数据结构,其中缀表达式串转换为一个后缀的程序。确切的代码是这样的--->

int prcd(char char); 
int und, outpos; 
char symb, topsymb; 

while(!und && prcd(topsymb, symb)) { <----- Stuck on this one real bad 
      postr[outpos++] = topsymb; 
      popandtest(&opstk, &topsymb, &und); 
} 

说明可能是不必要的,但只是把事情放到上下文中。 ;)

编辑:

我真的很抱歉,如果这个问题有点不清楚的人谁试图帮助,所以我会解释多一点什么我真的问这里

让我们忘了我在本文的精心部分写的代码,并返回到第一个,让我们只说我们有一个while循环,简单明了,同时循环

while(!condition1 && condition2) { 
execute some codes; 
} 

这里,condition1 = und,und是一个int,其值可以是0或1(和NOTHEELSE)。 0和1分别被宏观化为FALSETRUE。和condition2 = prcd(topsymb, symb);这是一个函数,其原型被提及为int prcd(char char);。它再一次返回0或1和NOTHEELSE。

现在我想知道的是如何while循环括号内的条件得到评估。

希望这可以解决问题。 :)

+0

'我想知道的是如何评估while循环括号内的条件。希望这可以解决问题。“ - 不,它不会清除事情。答案仍然和以前一样。当且仅当满足条件时,while循环内的所有内容才被“评估”。 –

+1

@SaniSinghHuttunen我亲爱的先生,当然你的答案保持不变。我只是为那些理解这个问题的人做了一些修改。但你首先知道我究竟在问什么。再次感谢:) – allocated

+0

如果condition1和condition2是:1,0或1,1 - 只评估condition1,并且循环不执行; 0,0 - 两种条件都被评估,但循环不执行; 0,1 - 两个条件都被评估,循环执行。 – Dmitri

回答

4

我的意思是在什么情况下/ s的循环体将执行以及其中 条件/ s时,将跳过

body将执行,如果var_can_be_0_or_1false(即0)和返回函数foo_returns_0_or_1的值是true(即不是0)。

如果不符合任何标准,则会跳过body

+2

...虽然注意到'foo_returns_0_or_1()'也不会被调用,如果var_can_be_0_or_1不是零。 – Dmitri

+1

@Dmitri:正确但与问题无关。 –

+0

谢谢@Sani SIngh Huttunen,正是我寻找的答案:) – allocated

1

&&运营商部队从左到右评估。 !var_can_be_0_or_1将得到充分评估(和任何副作用适用);如果表达式的结果不为零(true),那么将评估foo_returns_0_or_1(arg1, arg2)。如果该表达式的结果也为非零(true),那么循环的主体将被执行,否则循环将退出。

2

我不能确定,如果这是你在找什么,但这里是什么,我相信你想要的:

while(!var_can_be_0_or_1 && // if this is '0', continue; else exit 
     foo_returns_0_or_1(a, b) // if this is NOT '0', continue; else exit 

这是否帮助?

使用您的宏,这是类似于编写

while (var_can_be_0_or_1 == FALSE && foo_returns_0_or_1 == TRUE) 

我说类似的,因为,如果函数foo_returns_0_or_1不返回1,而是返回一些其他的号码,那么你的真宏将不匹配,如上所述,条件测试将失败。

C不要求你写等式(== TRUE),而是可以对函数的输出或变量的状态进行求值,如果它是一个int,并且是这个语句的更好选择。

正如@John Bode所说,如果第一个条件失败,那么第二个条件将永远不会被测试。由于这是一个函数,所以函数永远不会被调用。

+0

这是否包括!?。我拒绝。 –

+0

我不明白你的意见。你能详细说明吗? – tjcertified

+0

当我在C中看到像'x == TRUE'这样的东西时,我会畏缩不前,因为当'x == TRUE'没有时,'x'仍然可以评估为true(通常,当'x'只能是0时或1)。 – Dmitri

0

我认为这是一些缺少前置条件的伪代码,因为它不会按原样编译。

  1. 如果“UND”是全球性的,那么它必须被初始化为零,while循环将永远是TRUE,如果里面的功能这必须是垃圾,因为它被分配在堆栈上,因此行为是不可预测的初始化。
  2. 同样,缺少prcd()的定义,很难建议它返回什么。

我认为你需要纠正与适当的投入问题。

+0

对不起,首先猜我的问题还不清楚,我会编辑它。 – allocated