条件紧随其后;

时间:2013-04-25 18:02:52

标签: c pointers while-loop

我被要求评论一些代码并描述它的作用。一切都很好,我对交换机的情况做了很好的处理,但现在我不确定是否有任何案例得到满足。我无论如何都无法运行或测试此代码,因为我的所有常规软件都已关闭。

除了默认情况下,还是使用此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的值不会是&gt; 10因此永远不会是2或4?

随着;在这段时间的条件背后,我是否会被撞到32以及以下如果会返回rByte?

5 个答案:

答案 0 :(得分: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,因此可以达到两种非默认情况。< / p>

答案 1 :(得分:2)

分号本身是一个空语句。这样做。

while (complicated_expression)
    ;

与:

相同
while (complicated_expression)
{
}

complicated_expression有副作用时经常使用它,因此不需要循环体。

答案 2 :(得分:1)

回答你的问题是不可能的。即使我们假设i0开始,谁知道在此代码块的开头有什么值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--之间的区别就是你所描述的:第一个变量(预减量)将递减Ptr.Five,然后返回结果值;第二个变量(后递减)将递减Ptr.Five但在递减之前返回值

答案 3 :(得分: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在案例内的代码执行之前递增。


关于副作用的快速说明:正如John Bode在评论中指出的那样,我对前递减和后递增表达式的描述不太准确。 这是因为将新值存储到Ptr.Five 不会必须立即发生。 然而,因为它必须在下一个序列点(就像&&)发生(好像),所以没有真正的模糊性。

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

答案 4 :(得分:0)

假设i0开始 - while循环正在解析pCommand数组的31个元素(1-31),在检查值之前递减Ptr.Five ,寻找小于10的值。如果找不到,则函数返回rByte - 然后检查pCommand[Ptr.Five] 的值之前递增...因此,交换机中使用的值是与while条件中使用的值相同。该值可能是任何切换条件,因为我们知道它小于10