2013-04-25 82 views
1

我被要求评论一些代码并描述它的功能。一切都很好,我很好地处理了切换案件中正在做的事情,但现在我不确定是否有任何案例遇到过。我目前还没有运行或测试此代码,因为我的主要机器与我的所有常规软件均已关闭。虽然条件遵循;

交换机的任何一种情况除了这个while循环的条件之外还有默认情况吗?是我简单地增加到32和rByte返回之前,甚至使开关?那是什么?一段时间之后的条件?不应该紧接着{....}而不是; ?

while(pCommand[--Ptr.Five] > 10 && ++i <32); 
if(i==32) 
{ 
    return rByte; 
} 
switch(pCommand[Ptr.Five++]) 
{ 
    case 2: ... (lots of code) 
      break; 
    case 4: ... (lots of cod) 
      break; 
    default: ... 
      break; 
} 

此外,--Ptr.Five如何处理与Ptr.Five ++?我的理解是第一个移动指针并使用该值,而第二个使用当前值和后增量。

我错过了什么吗?即使移动过去;经过这段时间的条件和缺乏{}之后,Ptr.Five的值不会> 10,因此永远不会是2或4?

随着;在这种情况的背后,我是否会碰到32,如果返回rByte,会怎么样?

+2

此代码是可怕的。这是一个采访,找到一个不同的雇主。 – 2013-04-25 18:05:08

回答

0
while(pCommand[--Ptr.Five] > 10 && ++i <32); 

没有一个机构,但循环条件本身有副作用,所以它做一些事情。

我们可以重新写为:

while (1) { 
    --Ptr.Five; 
    if (pCommand[Ptr.Five] <= 10) 
     break; 
    ++i; 
    if (i == 32) 
     break; 
} 
if (i == 32) { 
    /* we never hit the pCommand condition */ 
} 

至于为什么

  • 它向后搜索通过pCommand,从偏移Ptr.Five到最多32个条目前面,找了值<= 10
  • 如果在32个条目中找不到这样的值,则返回rByte
  • 如果确实找到这样的值,它接通,并做了一些工作
    • PtrFive递增,以指示该值后,下一个条目,后的开关被分派

此外,如何在--Ptr.Five处理主场迎战Ptr.Five ++?我的理解是第一个移动指针并使用该值,而第二个使用当前值和后增量。

这是完全正确的。在:

pCommand[--Ptr.Five] > 10 

Ptr.Five表达的其余部分被评估之前递减,而在:

pCommand[Ptr.Five++] 

表达与的Ptr.Five价值评估,那么它的右后递增。这意味着交换机基于pCommand中的旧条目(结束while循环的那个条目,因为它的编号为<= 10),但Ptr.Five会在案例中的代码执行之前递增。


快速注意的副作用:如约翰·伯德在评论中指出,我的预减和后加表达式的描述是不太准确。 这是因为将新值存储到Ptr.Five并不是必须马上发生。然而,由于它必须发生(仿佛)下一个序列点,这里是&&,所以没有真正的歧义。

如果在单个语句中将多个相互依赖的副作用表达式组合在一起,这通常只会成为问题。所以,你知道,尽量避免这种情况。

+0

“在评估表达式的其余部分之前,”Ptr.Five“递减” - 这不完全正确。表达式“--Ptr.Five”的*结果*是“Ptr.Five”的值减1,但*副作用*在表达式的其余部分被评估之前可能不会被应用。 – 2013-04-25 21:20:56

+0

非常感谢您的好评! – walshrm 2013-04-25 21:45:46

+0

第一个'if(i == 32)'是错误的。 while'循环在'++ i <32'时迭代,所以break条件是'i> = 32',而不是'=='。 – CiaPan 2016-02-01 08:16:38

2

环路

while(pCommand[--Ptr.Five] > 10 && ++i <32); 

递减Ptr.Five和增量i直到

  • pCommand[Ptr.Five] <= 10,或
  • i >= 32

先发生者为准。由于感兴趣变量的变化是在循环条件下完成的,所以循环体应该是空的。 (不,这是特别好的风格,但我见过更糟。)

如果i == 32,没有达到switch,否则,如果i < 32,你知道pCommand[Ptr.Five] <= 10,这样既非默认的情况下,即可到达。

2

分号本身是一个空的陈述。因此,例如

while (complicated_expression) 
    ; 

是一样的:

while (complicated_expression) 
{ 
} 

它经常被用来当complicated_expression有副作用,所以不需要循环体。

0

i。假定在开始0 - while循环通过pCommand阵列的31个元素(1-31)解析,检查值,查找小于10值之前递减Ptr.Five。如果没有找到,则返回rByte - 然后检查pCommand[Ptr.Five]的值,然后它会增加......因此,交换机中使用的值与while条件中使用的值相同。值可能是任何开关条件,因为我们知道它不到10

1

这是不可能回答你的问题。即使我们假设i开始于0,谁知道pCommand[Ptr.Five]在该代码块的开始处有什么值?

解决一些问题,这可以回答,这将有助于如果我们重写了while这样的:

while(pCommand[--Ptr.Five] > 10 && ++i <32) 
{ 
    /* do nothing as the body of the loop... nothing at all. 
    * Everything happens in the condition. 
    */ 
} 

与分号的语法是有效的,如果一个位在第一混乱:思考在C/C++中分号意味着什么(终止一个语句),然后想一想在这种情况下语句终止的是什么(提示:这是一个“无操作”)。

--Ptr.FivePtr.Five--之间的区别就是你所描述的:第一个变体(pre-decrement)将递减Ptr.Five然后返回结果值;第二个变体(后减量)将递减Ptr.Five,但在之前返回值的递减量。