我有一个切换不同字符串长度的switch case: 意思
switch(x.GetLength())
{
case 0 // means string length is 0
... and so on
}
我面临的问题是有两个长度相同的字符串为6,所以我将有两个具有相同数字的情况
案例6
案例6
第一种情况下的字符串总是以数字的形式出现,不包含任何字母/字符
第二种情况下的字符串总是在字符串的开头带有字符P.
我想在两种情况之间进行分类:我尝试的是切换 (x.GetLength(),X.GetAt(0))
但它给出了一个错误,即case表达式不是常量 否则我不能有两个具有相同数字的案例
switch(m_strScanned.GetLength(), X.GetAt(0)) // switch over String Length
{
case (6,2): // This case where the 6 digits are all numbers
WTN: if (m_strScanned.Mid(2,1).FindOneOf(".,/*-+ABCDEFGHIJKLMNOPQRSTUVWXYZ")>=0) goto Y;
if(m_strScanned.Mid(3,1).FindOneOf(".")>=0) goto X;
else
{
....
break;
}
case (6,'P'):
goto TYPE; // this is where the first digit is P
TYPE: if(m_strScanned.Mid(2,1).FindOneOf("ABCDEFGHIJKLMNOPQRSTUVWXYZ")>=0)
goto Y;
if(m_strScanned.Mid(3,1).FindOneOf(".")>=0) goto X;
else
{
....
break;
}
是否存在避免if else条件的解决方案
感谢您的帮助
答案 0 :(得分:1)
没有仅使用switch
语句和case
标签的解决方案,您必须拥有一个case
,然后使用例如在其中if
选择正确的代码:
switch (m_strScanned.GetLength())
{
...
case 6:
if (m_strScanned[0] == 'P')
{
// Handle this special case
}
else
{
// Handle this other special case
}
break;
...
}
答案 1 :(得分:1)
坎。我很惊讶这个编译。案例标签需要是编译时可评估的常量表达式,但常量表达式不能包含逗号运算符!
我认为您的(因此非标准合规)编译器会将case (6,2)
视为case 2
而将switch(m_strScanned.GetLength(), X.GetAt(0))
视为switch (X.GetAt(0))
,因为逗号运算符有效。甚至可能(尽管我认为不太可能)你可能有一个编译器扩展,将case (6, 2):
视为case 6: case 2:
,依此类推。但如果你利用它,那么你就放弃了可移植性。
没有什么可以阻止您在if
中使用case 6
块进一步消除歧义,或者完全放弃switch
以支持if
阻止。
答案 2 :(得分:0)
case 6:
if('P'==x[0]) {
// do something
}
else {
// do something else
}
break;
这有什么问题?