我们有一项学校任务要从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++;
}
由于某种原因,第二种变化甚至都没有进入循环。我试着思考它,但找不到原因,为什么它们的工作方式不同。
答案 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 --|____/ |__/
然后你得到:
x --- NOT GATE --- \
-- OR GATE -- NOT (from NAND) -- NOT (negate output)
y --- NOT GATE --- /
答案 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,则输入循环。要做到这一点,你需要表达你的成功。