if语句中的多个条件

时间:2013-04-29 14:24:36

标签: c++ if-statement

无论在这里产生什么数字,我总是得到第一个选项(企鹅)。我似乎无法看到我的代码有任何问题,其他人都看到了什么问题?

{
    srand(time(0));
    prand = (rand() % 20);
    if (prand == 1,5,9,10,14,15,19,20){
        entity = "penguins";
        srand(time(0));
        pquantity = (rand() % 8) + 2;
    }
    else if (prand == 2,6,11,16,18){
        entity = "troll";
        pquantity = 1;
    }
    else if (prand == 3,7,12,17){
        entity = "goblin";
        pquantity = 1;
    }
    else if (prand == 4,8,13){
        entity = "wizard";
        pquantity = 1;
    }
}

5 个答案:

答案 0 :(得分:10)

代码片段prand == 1,5,9,10,14,15,19,20是一个表达式序列,通常称为逗号运算符),其结果为: first (或 last - 取决于语言)表达式 only 用作if语句的条件。剩下的表达式被评估并且它们的值被遗忘(请注意,这可能会在更复杂的情况下导致严重的副作用。)

您使用的是哪种语言并不是很清楚,但在C#中,您可以使用switch statement来实现您想要的语言:

switch (prand)
{
    // first set of options
    case 1:
    case 5:
    …
    case 20:
        // your code here
        break;

    // second set of options
    case 2:
    case 6: 
    …
    case 18:
        // your code here
        break;

    default:
        // all other options not listed above
        break;
}

大多数语言都有这样的陈述。有关一般说明,请参阅此wikipedia article

答案 1 :(得分:3)

你误用了逗号运算符。第一个表达式 如果是:

if ( (prand == 1), (5), (9), (10), (14), (15), (19), (20) )

每个逗号都是逗号运算符。的定义 逗号运算符是为了评估第一个表达式(for 可能的副作用),然后评估第二;的价值 表达式是第二个表达式的值。所以你的 如果变得完全等同于:

if ( 20 )

并且20被隐式转换为bool,从而导致 true

您的编译器应该已经警告过您。要做的事 无用表达的影响。

答案 2 :(得分:1)

if (prand == 1,5,9,10,14,15,19,20)

虽然这是有效的C ++并且会进行编译,但它并没有达到预期效果。您需要依次将变量与每个值进行比较:

if (prand == 1 || prand == 5 || prand == 9 || prand == 10 || prand == 14 || prand == 15 || prand == 19 || prand == 20)

这是因为==是一个二元运算符,它采用两个兼容类型的值。

在这种情况下,最好使用switch ... case语句,正如@Ondrej所解释的那样。

我可以想到至少两种模拟掷骰子的方法(看起来你正试图这样做:

  1. 为每个选项使用连续值:

    if (prand >= 1 && prand <= 8) {
        // ...
    } else if (prand >= 9 && prand <= 13) {
        // ...
    } else if (prand >= 14 && prand <= 17) {
        // ...
    } else if (prand >= 18 && prand <= 20) {
        // ...
    } else {
        // Print an error message
    }
    
  2. 将不同的可能性存储在std::list<std::set<int>>中。然后,您可以迭代列表中的集合,并使用std::set.contains()方法检查当前集合是否包含该值。这具有可伸缩性的优点。例如,它可以更容易地为1d100或其他具有大量可能值的骰子卷进行编码。

答案 3 :(得分:1)

如果是“C”,那么您正在测试逗号运算符的结果。因此prand == 1,5,9,10,14,15,19,20的结果是最后一个元素(BTW第一个元素是prand == 1)。 20总是如此。

我建议建立一个数组并检查其元素......

enum Being_t {BEING_PENGUIN, BEING_TROLL, BEING_GOBLIN, BEING_WIZARD};
enum Being_t arr[20] = {BEING_PENGUIN, BEING_TROLL, BEING_GOBLIN, BEING_WIZARD,
    BEING_PENGUIN, BEING_TROLL, BEING_GOBLIN, BEING_WIZARD, ...};

然后你可以使用开关

srand(time(0));
prand = (rand() % 20);
switch (arr[prand]) {
case BEING_PENGUIN:
    ...
    break;
...
}

答案 4 :(得分:0)

您应该使用或者或切换语句。例如,if if

if (prand == 1 || prand == 5 || prand == 9 || prand == 10 || prand == 14|| prand == 15|| prand == 19|| prand == 20)
{
        // your code here
}

并使用开关

switch (prand)
{
    case 1:
    {

        // your code here

        break;
    }
    case 5:
    {

        // your code here

        break;
    }
    case 9:
    {

        // your code here

        break;
    }
    case 10:
    {

        // your code here

        break;
    }
    case 14:
    {

        // your code here

        break;
    }
    case 15:
    {

        // your code here

        break;
    }
    case 19:
    {

        // your code here

        break;
    }
    case 20:
    {

        // your code here

        break;
    }
}