我在一个嵌入式系统上工作,其中必须访问一个寄存器,然后递增以获得我正在寻找的结果,因为机器正在通知并配置为对我的访问使用react并更改或不更改改变标志。所以 switch
的参数必须保持原样,否则它会改变嵌入式系统的行为。
但可能会出现我不想调用任何案例的情况。但我仍然需要访问和增加 switch
的参数。
(更深入我正在逐步将一系列模拟值转换为数字值转换。索引用于与当前转换保持同步并将其与相应的情况相关联以正确处理数字。可能会发生索引与当前转换不同步的状态,因此必须在不调用任何情况的情况下运行转换序列(以防止设置错误数据),直到序列完成并且可以执行重新同步)
我目前的做法是这样的:
switch (RunIndex++)/*RunIndex may only be accessed one time per execution
of this construct and has to be incremented in the same step. thats given.*/
{
if (RunIndexSyncedWithADCensured == false)
{
break;
}
case 0:
Case0RelatedData = SomeOperationsForCase0(RawData);
break;
case 1:
Case1RelatedData = SomeOperationsForCase1(RawData);
break;
case 2:
Case2RelatedData = SomeOperationsForCase2(RawData);
break;
default:
RunIndex = 0;
break;
}
这个构造完成了工作,但它看起来有点争议,考虑将其提交到产品代码中我感觉不太好。
那么有没有更好看的方法来实现相同的目标,而不需要额外的变量或赋值?
注意:
这也可能是相关的,它位于由两部分组成的中断函数的第一部分。
第一部分处理必须发生的事情 if()
转换完成。第二部分,有什么额外要做的 if()
这个转换也结束了序列。因此,不进入第二部分就简单地从函数返回是没有选择的。并且目前没有if(...)break;
可能会爆发的循环结构。 (这也是为什么我将 if 放在 switch 范围内的原因,因为它至少按照标准是一种有效的突破方式。)
最佳答案
首先,switch()
中的if()
永远不会被执行。
考虑以下代码片段:
#include <stdio.h>
int main(int argc, char *argv[])
{
int i = 2;
switch(i) {
if (i == 2) {
printf("I M HERE\n");
}
case 1:
printf("1\n");
break;
case 2:
printf("2\n");
break;
default:
printf("default\n");
break;
}
return 0;
}
对于您的代码:您希望打印字符串 I M HERE
。但事实并非如此。
上述代码片段的输出是:
2
No statements before case/default(switch constructs): 在switch内部执行
现在回答
I don't want to get any of the cases get invoked. But I still need to acces and increment the argument of the switch
只需将 if()
移到 switch() 之外。
if (RunIndexSyncedWithADCensured) {
switch (RunIndex++) {
case 0:
Case0RelatedData = SomeOperationsForCase0(RawData);
break;
/* Other cases here */
default:
RunIndex = 0;
break;
}
} else
RunIndex++;
关于c - 这个 switch case 构造有更好的实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32475804/