非常混乱的while循环条件

时间:2017-06-30 08:28:42

标签: c logical-operators boolean-logic

我们有一项学校任务要从C代码文件中删除C-comments。

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

var rightPart = $('.anotherOne');
var numberOfLines = {
  first: $('#caption_1'),
  second: $('#caption_2'),
  third: $('#caption_3')
}
for (var key in numberOfLines) {
  numberOfLines[key].hide(); //numberOfLines[key] holds the `$('#caption_1')...` elements
}

来。

为什么此代码有效,

*/

但这不是吗?

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

由于某种原因,第二种变化甚至都没有进入循环。我试着思考它,但找不到原因,为什么它们的工作方式不同。

5 个答案:

答案 0 :(得分:3)

!(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工作。

现在考虑一下NAND,它们是跟随输入X和Y的非门的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以及所有其他步骤。

答案 1 :(得分:1)

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

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循环产生两个不同的结果。

答案 2 :(得分:0)

循环测试条件有一个AND表达式,其中 首先评估表达式的第一个或左侧 ,看看我们是否还需要检查第二个 这是假的,这意味着我们不需要将第二个检查为False && anything = False)。

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

答案 3 :(得分:0)

它应该是OR而不是AND,

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

如果我不是明星*则不能阻止评论。 如果我是明星*然后如果i + 1不是斜线' /'然后它不能阻止评论。

答案 4 :(得分:0)

在你测试的第一个声明......

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

当评估为!true时,进入循环。为了这个!你的一个表达式需要失败。

在第二个陈述中你测试......

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

如果此计算结果为true,则输入循环。要做到这一点,你需要表达你的成功。