让我们考虑以下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分别对FALSE
和TRUE
进行宏。 condition2
= prcd(topsymb, symb)
;它是一个函数,其原型被称为int prcd(char char);
。再次,它返回0或1,并且没有ELSE。
现在我想知道的是如何 while
循环括号中的条件得到评估。
希望这可以解决问题。 :)
答案 0 :(得分:4)
如果我的意思是循环体将在什么条件下执行以及在哪种情况下 条件/ s它将跳过
body
为var_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)
我认为这是一些缺少前置条件的伪代码,因为它不会按原样编译。
我认为您需要通过适当的输入来纠正问题。