C语言 非常混乱的while-loop条件



我们有一个学校任务,从C代码文件中删除C注释。

此任务有一种方法可以遍历输入文件并循环直到块注释结束

*/

来了。

为什么这段代码有效,

while(!(input[i] == '*' && input[i+1] == '/'))
{
i++;
}

但这不行吗?

while(input[i] != '*' && input[i+1] != '/')
{
i++;
}

由于某种原因,第二个变体甚至从未进入循环。我试图思考它,但找不到为什么它们的工作方式不同。

!(something AND something)NAND门,它们可以表示为!something OR !something

所以在你的情况下

while (!(input[i] == '*' && input[i+1] == '/')) {

//Pick your syntax from these 2 options
while (input[i] != '*' || input[i+1] != '/')
while (!(input[i] == '*') || !(input[i+1] == '/'))

从 AND 到 OR 的过渡如何工作。

现在考虑你有NAND,它是AND门,后面是带有输入X和Y的NOT门。结果是两个输入的 AND 为反。要将两个输入都分离到 OR,您必须执行以下步骤:

____      __
x --|        |  
| AND |---|NOT|--- (NAND)
y --|____/    |__/
  • 将 AND 更改为 OR
  • 通过移除门或再次否定输出来移除 NOT
  • 分别否定每个输入

然后你会得到:

x --- NOT GATE ---  
-- OR GATE -- NOT (from NAND) -- NOT (negate output)
y --- NOT GATE --- /
  • 如果你想做相反的事情,你可以这样做(NOR和AND(,只需再次交换OR和AND以及所有其他步骤。

您的问题可以通过将它们放在真值表中来回答

while(!(input[i] == '*' && input[i+1] == '/'))
{
i++;
}

生成 NAND 门的真值表

input[i]  input[i+1] Output
0          0       1  
0          1       1  
1          0       1
1          1       0

while(input[i] != '*' && input[i+1] != '/')
{
i++;
}

生成 NOR 门的真值表

input[i]  input[i+1] Output
0          0       1  
0          1       0  
1          0       0
1          1       0

现在,您可以轻松了解为什么两个 while 循环会产生两种不同的结果。

循环测试条件有一个 AND 表达式,其中首先计算表达式的第一侧或左侧,以查看我们是否需要也检查第二个(如果它是假的,这意味着我们不需要检查第二个作为False && anything = False(。

在这里,第一个条件是input[i] != '*'。 这就是为什么当字符不在行首 * 时,循环会在第一次执行本身时退出。

它应该是OR而不是AND,

while (input[i] != '*' || input[i+1] != '/')

如果我不是星号*,那么它不能是阻止评论。 如果我是星号*,那么如果 I+1 不是斜杠"/",那么它就不能是块注释。

在你测试的第一个语句中...

(input[i] == '*' && input[i+1] == '/')

当结果为 !true 时,您将进入循环。要使这成为真,您的一个表达式需要失败。

在第二个语句中,您测试...

input[i] != '*' && input[i+1] != '/'

当此值计算为 true 时,您将进入循环。要做到这一点,你需要两个表达成功。

最新更新