我被要求评论一些代码并描述它的作用。一切都很好,我对交换机的情况做了很好的处理,但现在我不确定是否有任何案例得到满足。我无论如何都无法运行或测试此代码,因为我的所有常规软件都已关闭。
除了默认情况下,还是使用此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?答案 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)
回答你的问题是不可能的。即使我们假设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
但在递减之前返回值。
答案 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
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)
假设i
从0
开始 - while循环正在解析pCommand
数组的31个元素(1-31),在检查值之前递减Ptr.Five
,寻找小于10
的值。如果找不到,则函数返回rByte
- 然后检查pCommand[Ptr.Five]
的值之前递增...因此,交换机中使用的值是与while
条件中使用的值相同。该值可能是任何切换条件,因为我们知道它小于10