c中switch语句中的多个变量

如何在c中使用switch语句在c中编写以下语句

int i = 10; int j = 20; if (i == 10 && j == 20) { Mymethod(); } else if (i == 100 && j == 200) { Yourmethod(); } else if (i == 1000 || j == 2000) // OR { Anymethod(); } 

编辑:

我已将最后一个案例从’和’更改为’或’以后。 所以我在编辑前回答我的问题的人道歉。

例如,这种情况,我只是想知道它是否可能。 我有谷歌这个,发现它是不可能的,但我更信任stackoverflow上的大师。

谢谢

一般来说,你不能。 你正在做的事情很好,虽然你可能想在最后添加一个else子句来捕获意外的输入。

在您的具体示例中,似乎j通常是i值的两倍。 如果这是一般规则,你可以尝试通过做这样的事情来利用它:

 if (i * 2 == j) /* Watch out for overflow here if i could be large! */ { switch (i) { case 10: // ... break; case 100: // ... break; // ... } } 

你正在迫切寻找那些不自然地强迫这个代码进入switch答案 – 对于你所描述的问题,这不是C,C ++或C#中的正确方法。 与if语句一起使用,因为在这种情况下使用switch会导致代码不太可读,并且可能导致漏洞引入错误。

有些语言会评估类似于if语句序列的switch语句语法,但C,C ++和C#不在其中。


在Jon Skeet的评论说“ 尝试使其发挥作用”之后,我会反对我的初步判断并继续发挥作用,因为通过尝试替代方案来了解它们的工作原理以及它们的位置确实可以学习不行。 希望我不会最终混淆事情而不是……

所考虑的语言中的switch语句的目标必须是常量 – 它们不是在运行时计算的表达式。 但是, 如果您可以将要作为切换目标的条件映射到散列函数,您将可能获得类似于您正在寻找的行为,该散列函数将生成匹配条件的完美散列。 如果可以这样做,您可以调用哈希函数并打开它产生的值。

当您想要打开字符串值时,C#编译器会自动为您执行类似的操作。 在C中,当我想要打开字符串时,我手动完成了类似的操作。 我将目标字符串与用于标识字符串的枚举放在一个表中,然后我打开枚举:

 char* cmdString = "copystuff"; // a string with a command identifier, // maybe obtained from console input StrLookupValueStruct CmdStringTable[] = { { "liststuff", CMD_LIST }, { "docalcs", CMD_CALC }, { "copystuff", CMD_COPY }, { "delete", CMD_DELETE }, { NULL, CMD_UNKNOWN }, }; int cmdId = strLookupValue( cmdString, CmdStringTable); // transform the string // into an enum switch (cmdId) { case CMD_LIST: doList(); break; case CMD_CALC: doCalc(); break; case CMD_COPY: doCopy(); break; // etc... } 

而不必使用if语句序列:

 if (strcmp( cmdString, "liststuff") == 0) { doList(); } else if (strcmp( cmdString, "docalcs") == 0) { doCalc(); } else if (strcmp( cmdString, "copystuff") == 0) { doCopy(); } // etc.... 

顺便说一下,对于字符串到函数的映射,我个人发现表查找/切换语句组合更具可读性,但我想有些人可能更喜欢if序列的更直接方法。

您在问题中使用的表达式集看起来并不是特别简单 – 您的哈希函数几乎肯定会成为if语句的序列 – 您基本上只是将构造移动到其他地方。 Jon Skeet的原始答案主要是将表达式转换为哈希值,但当or操作被抛入其中一个测试的混合时,哈希函数就会崩溃。

(删除了原来的答案:我错过了条件是“OR”而不是“AND”的事实。编辑:啊,因为显然它不是从一开始。)

理论上你仍然可以使用类似我的原始代码(将两个32位整数组合成一个64位整数并打开它),尽管会有2 ^ 33个case语句覆盖最后一个条件。 我怀疑任何编译器实际上都会通过这样的代码:)

但基本上没有:改为使用if / else结构。