奇怪的条件检查

时间:2017-02-17 16:24:54

标签: c while-loop conditional

让我们考虑以下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(和NOTHING ELSE)。 0和1分别对FALSETRUE进行宏。 condition2 = prcd(topsymb, symb);它是一个函数,其原型被称为int prcd(char char);。再次,它返回0或1,并且没有ELSE。

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

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

4 个答案:

答案 0 :(得分:4)

  

我的意思是循环体将在什么条件下执行以及在哪种情况下   条件/ s它将跳过

如果bodyvar_can_be_0_or_1(即false)并且函数0的返回值为foo_returns_0_or_1,则

true将会执行(即不是0)。

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

答案 1 :(得分: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,而是返回一些其他数字,那么你的TRUE宏将不匹配,条件测试将失败,如上所述。

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

正如@John Bode指出的那样,如果第一个条件失败,那么第二个条件将永远不会被测试。由于这是一个函数,因此可能永远不会调用该函数。

答案 2 :(得分:1)

&&运营商强制进行从左到右的评估。将!var_can_be_0_or_1进行全面评估(并应用任何副作用);如果表达式的结果为非零(true),则将评估foo_returns_0_or_1(arg1, arg2)。如果该表达式的结果也是非零(true),则将执行循环体,否则循环将退出。

答案 3 :(得分:0)

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

  1. 如果'und'是全局的那么它必须被初始化为零而while循环将始终为TRUE,如果在函数内部必须用垃圾初始化它,因为它是在堆栈上分配的,因此行为是不可预测的。
  2. 同样,缺少prcd()的定义,很难说明它返回的内容。
  3. 我认为您需要通过适当的输入来纠正问题。