我们有一个学校任务,从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 时,您将进入循环。要做到这一点,你需要两个表达成功。