嗨大家好我试着编写一个简单的switch语句并且遇到了这个问题。 我无法弄清楚为什么这段代码正常工作,我想这是因为运算符**和++的优先级。 如果遇到这种情况,如果有人可以写一个例子,我应该如何在下面的语句中使用value-at *和inc / dec运算符。
提前致谢,
while (--argc > 0)
argv++;
switch (**argv)
这个代码不是
while (--argc > 0)
switch (**(argv++))
完整代码:
while (--argc > 0) {
switch (**(argv++)) {
case '\0':
panic("empty command line argument");
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
push (atof(*argv));
break;
case '+':
push(pop() + pop());
break;
case '-':
op2 = pop();
push(pop() - op2);
break;
case '*':
push(pop() * pop());
break;
case '/':
op2 = pop();
push(pop() / op2);
break;
default:
panic("unknown command");
break;
}
}
答案 0 :(得分:2)
在任何表达式中对给定变量使用后增量会导致变量在表达式被评估后递增。
正如您的第一个工作代码所述,您在中增加argv
值之前获取它在交换机中的参考值,您希望变量增加 之前评估您的表达式,因此您需要使用preincrement:
while (--argc > 0)
switch (**(++argv))
答案 1 :(得分:0)
我认为你被括号弄糊涂了。括号会影响评估的顺序,但是您使用的是在最后应用的后增量,无论运算符的评估顺序如何。
在您的第一个代码段中,订单是明确的:首先您增加了argv,然后您取消引用它。也就是说,您取消引用“下一个”元素,而不是当前元素。
在您的第二个片段中,您希望获得相同的结果,并且您正在使用括号。这不是解决方案。括号会影响2个运算符(++
和**
)评估的顺序,但这并不意味着效果按此顺序应用。
例如:如果你写了
switch ((**argv)++)
编译器首先应用**
,取消引用它,为您提供内容,然后在其上应用++
(显然argv
必须是可以增加的数据类型或者会有错误,但这里没关系)。相反,如果你像你一样写作,
switch (**(argv++))
首先应用增量(++
),然后应用间接(**
)。但这里有诀窍:后增量仍然是后增量。在此处应用后增量意味着:获取当前值,并在完成所有操作后记得增加它。因此argv
按原样使用,但尚未增加({),并发送到**
,这将提供当前值(不是下一个!)。然后,在switch
读取当前元素后,argv会增加(后递增),因此如果您的case
打印**argv
,您会注意到它是“下一个”值。< / p>
解决方案是使用预增量:
switch (**(++argv))
但如果你问我,真正的解决办法就是完全避免这些麻烦,并将代码编写成两行,这样就可以立即明白发生了什么。正如您在第一个片段中所做的那样。这是最易阅读的风格,因此应该是首选。然后你可以忘记一切:评估顺序,括号,前后增量,相关性。