奇怪的条件检查
Weird Condition Checks
让我们考虑以下 C 代码片段。
while(!var_can_be_0_or_1 && foo_returns_0_or_1(arg1, arg2)) {
body;
}
这是一个简单的 while 条件语句,它执行我无法理解的操作。但是假设我有两个宏
#define TRUE 1
#define FALSE 0
有人可以告诉我(或者更确切地说是向我解释)我们在这个 while 循环的条件下检查什么吗?我的意思是循环体将在 condition/s 中执行,在 condition/s 中将跳过?
详解
我在一本关于数据结构的书中找到了它,该程序将中缀表达式字符串转换为后缀字符串。确切的代码是这样的--->
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 是一个整数,其值可以是 0 或 1(除此之外别无其他)。 0 和 1 分别宏化为 FALSE
和 TRUE
。并且 condition2
= prcd(topsymb, symb)
;它是一个函数,其原型被称为 int prcd(char char);
。同样,它 returns 0 或 1,没有别的。
现在我想知道的是如何 while
循环括号内的条件得到评估。
希望这能解决问题。 :)
I mean in what condition/s the loop body will execute and in which
condition/s it will skip
body
将在 var_can_be_0_or_1
为 false
(即 0
)且函数 foo_returns_0_or_1
的 return 值为 true
(即不是 0
)。
如果不满足任何一个条件,则 body
将被跳过。
&&
运算符强制 left-to-right 求值。 !var_can_be_0_or_1
将得到全面评估(并应用任何副作用);如果表达式的结果是 non-zero (true),那么将计算 foo_returns_0_or_1(arg1, arg2)
。如果那个表达式的结果也是non-zero(真),那么循环体将被执行,否则循环将退出。
我不确定这是否是您要找的,但我相信这是您想要的:
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
不是 return 1,而是 return 其他数字,那么您的 TRUE 宏将不匹配,并且如上所述,条件测试将失败。
C 不需要你写等式 (== TRUE),而是可以对函数的输出或变量的状态求值,如果它是一个 int,这是更好的选择声明。
正如@John Bode 指出的那样,如果第一个条件失败,则永远不会测试第二个条件。既然这是一个函数,那么有可能这个函数永远不会被调用。
我认为这是一些缺少前置条件的伪代码,因为它不会按原样编译。
- 如果 'und' 是全局的,那么它必须初始化为零并且 while 循环将始终为 TRUE,如果在函数内部,则必须用垃圾初始化,因为它是在堆栈上分配的,因此行为是不可预测的.
- 同样,缺少 prcd() 的定义,很难说明它是什么 returns。
我认为您需要通过适当的输入来更正问题。
让我们考虑以下 C 代码片段。
while(!var_can_be_0_or_1 && foo_returns_0_or_1(arg1, arg2)) {
body;
}
这是一个简单的 while 条件语句,它执行我无法理解的操作。但是假设我有两个宏
#define TRUE 1
#define FALSE 0
有人可以告诉我(或者更确切地说是向我解释)我们在这个 while 循环的条件下检查什么吗?我的意思是循环体将在 condition/s 中执行,在 condition/s 中将跳过?
详解
我在一本关于数据结构的书中找到了它,该程序将中缀表达式字符串转换为后缀字符串。确切的代码是这样的--->
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 是一个整数,其值可以是 0 或 1(除此之外别无其他)。 0 和 1 分别宏化为 FALSE
和 TRUE
。并且 condition2
= prcd(topsymb, symb)
;它是一个函数,其原型被称为 int prcd(char char);
。同样,它 returns 0 或 1,没有别的。
现在我想知道的是如何 while
循环括号内的条件得到评估。
希望这能解决问题。 :)
I mean in what condition/s the loop body will execute and in which condition/s it will skip
body
将在 var_can_be_0_or_1
为 false
(即 0
)且函数 foo_returns_0_or_1
的 return 值为 true
(即不是 0
)。
如果不满足任何一个条件,则 body
将被跳过。
&&
运算符强制 left-to-right 求值。 !var_can_be_0_or_1
将得到全面评估(并应用任何副作用);如果表达式的结果是 non-zero (true),那么将计算 foo_returns_0_or_1(arg1, arg2)
。如果那个表达式的结果也是non-zero(真),那么循环体将被执行,否则循环将退出。
我不确定这是否是您要找的,但我相信这是您想要的:
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
不是 return 1,而是 return 其他数字,那么您的 TRUE 宏将不匹配,并且如上所述,条件测试将失败。
C 不需要你写等式 (== TRUE),而是可以对函数的输出或变量的状态求值,如果它是一个 int,这是更好的选择声明。
正如@John Bode 指出的那样,如果第一个条件失败,则永远不会测试第二个条件。既然这是一个函数,那么有可能这个函数永远不会被调用。
我认为这是一些缺少前置条件的伪代码,因为它不会按原样编译。
- 如果 'und' 是全局的,那么它必须初始化为零并且 while 循环将始终为 TRUE,如果在函数内部,则必须用垃圾初始化,因为它是在堆栈上分配的,因此行为是不可预测的.
- 同样,缺少 prcd() 的定义,很难说明它是什么 returns。
我认为您需要通过适当的输入来更正问题。