1

我被要求评论一些代码并描述它的作用。一切都很好,我很好地掌握了 switch 案例中正在做的事情,但现在我不确定是否曾经遇到过任何案例。我目前无需运行或测试此代码,因为我的主机和所有常规软件都已关闭。

除了默认情况下,是否会在此 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++ 相比如何处理?我的理解是第一个将指针移回并使用该值,而第二个使用当前值并发布增量。

我错过了什么吗?甚至移动过去;在 while 的条件和 while 之后缺少 {} 之后,Ptr.Five 的值不会 > 10,因此永远不会是 2 或 4?

与 ; 在这段时间的情况下,我会不会被撞到32,如果会返回rByte?

4

5 回答 5

2

循环

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

递减Ptr.Five和递增i直到

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

以先发生者为准。由于对感兴趣变量的更改是在循环条件中完成的,因此循环体应该为空。(并不是说它的风格特别好,但我见过更糟的。)

如果i == 32switch则未达到,否则,如果i < 32,您知道 ,pCommand[Ptr.Five] <= 10则可以达到两种非默认情况。

于 2013-04-25T18:07:34.437 回答
2

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

while (complicated_expression)
    ;

是相同的:

while (complicated_expression)
{
}

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

于 2013-04-25T18:08:04.190 回答
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.Five和之间的区别Ptr.Five--就是您所描述的:第一个变体(预减量)将减量Ptr.Five,然后返回结果值;第二个变体(后递减)将递减Ptr.Five但返回递减之前的值。

于 2013-04-25T18:11:59.010 回答
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 这是因为不必立即将新值存储到其中。但是,由于它确实必须(好像)在下一个序列点(这里是 )之前发生&&,所以没有真正的歧义。

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

于 2013-04-25T18:10:33.423 回答
0

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

于 2013-04-25T18:10:34.813 回答