【问题标题】:Weird Condition Checks奇怪的条件检查
【发布时间】:2017-07-07 06:21:49
【问题描述】:

让我们考虑以下 C 代码 sn-p。

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

这是一个简单的 while 条件语句,它完成了我无法理解的事情。但是假设我有两个宏

#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 循环

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

这里,condition1 = und,und 是一个 int,它的值可以是 0 或 1(没有其他值)。 0 和 1 分别宏化为 FALSETRUE。和condition2 = prcd(topsymb, symb);这是一个原型被称为int prcd(char char); 的函数。它再次返回 0 或 1 而没有其他任何内容。

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

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

【问题讨论】:

  • I want to know is how the condition inside the while loop brackets gets evaluated. Hope this clears things up. - 不,它并没有把事情弄清楚。答案还是和以前一样。当且仅当满足条件时,while 循环内的所有内容都会被“评估”。
  • @SaniSinghHuttunen 亲爱的先生,您的回答当然是一样的。我只是为那些难以理解问题的人做了一些编辑。但你一开始就知道我在问什么。再次感谢:)
  • 如果条件 1 和条件 2 是:1,0 或 1,1 -- 只计算条件 1,不执行循环; 0,0 -- 两个条件都被计算,但循环不执行; 0,1 -- 两个条件都被计算,循环执行。

标签: c while-loop conditional


【解决方案1】:

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

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

如果任一条件不满足,则将跳过body

【讨论】:

  • ...虽然同样重要的是要注意,如果 var_can_be_0_or_1 不为零,则不会调用 foo_returns_0_or_1()
  • @Dmitri:正确但与问题无关。
  • 感谢@Sani Singh Huttunen,正是我正在寻找的答案:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我不确定这是否是您正在寻找的,但我相信您想要的是:

    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 所说,如果第一个条件失败,则永远不会测试第二个条件。既然这是一个函数,那么这个函数可能永远不会被调用。

    【讨论】:

    • 这是否包括!?。我说不。
    • 我不明白你的评论。你能详细说明一下吗?
    • 当我在 C 中看到像 x == TRUE 这样的东西时,我会感到畏缩......因为 x 仍然可以在 x == TRUE 不正确的情况下评估为 true(通常,当 x 只能是0 或 1)。
    • 我同意,@Dmitri。我只是将它包括在内,以使事情变得非常清楚。请注意,除非您绝对确定结果只有 0 或 1,否则可能不应该使用它。
    • 什么“这个”是模棱两可的。如果这是 !var_can_be_0_or_1 那么您的评论是错误的。如果是 var_can_be_0_or_1 那么你就可以了。
    【解决方案4】:

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

    1. 如果 'und' 是全局的,那么它必须初始化为零并且 while 循环将始终为 TRUE,如果在函数内部,它必须用垃圾初始化,因为它是在堆栈上分配的,因此行为是不可预测的。
    2. 同样,由于缺少 prcd() 的定义,很难说明它返回的内容。

    我认为您需要通过适当的输入来纠正问题。

    【讨论】:

    • 对不起,我的问题一开始就不清楚,我会编辑它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2015-09-11
    • 1970-01-01
    相关资源
    最近更新 更多