(C++) Случайные числа равны, но программа говорит, что это не так

Я новичок, и я создал симулятор игрового автомата. Колесо вращается, и x, y и z задаются случайными числами. У меня есть оператор if, который проверяет, является ли x == y == z. Когда программа запускается и числа на самом деле равны, она запускает мой код, который говорит, что они не равны. Почему это происходит?

Например, в операторе cout будет указано 2 -- 2 -- 2, затем он переходит к моему оператору if, если они не равны, и я получаю код «вы проиграли».

Я должен добавить, что это происходит не каждый раз. Иногда он правильно выполняет оператор if, когда они равны. Это очень странно.

    srand(time(0));

    int x = (rand() % 2) + 1;
    int y = (rand() % 2) + 1;
    int z = (rand() % 2) + 1;

    std::cout << "The spin results are... " << x << " -- " << y << " -- " << z << std::endl << std::endl;

    if( x == y == z)
    {
    std::cout << "You win!\n\n";
    playerCoins = playerCoins + (coinsBet * 2);
    }
    else 
    {   
        std::cout << "You lose!\n\n";
    }

person Don    schedule 28.06.2015    source источник
comment
Я бы предложил использовать возможности заголовка ‹random› вместо rand, так как он устарел.   -  person Ilio Catallo    schedule 28.06.2015


Ответы (4)


x == y может привести к 0 или 1, в зависимости от их истинного или ложного значения. Затем 0 или 1 сравнивается с z, поэтому данный результат неверен.

Правильный метод — проверить, равен ли x z и y равен z, что, конечно, также означает, что x равен y. (x == z) && (y == z)

person A B    schedule 28.06.2015

x == y == z делает не то, что вы думаете. Вместо этого используйте x == y && y == z.

person fredoverflow    schedule 28.06.2015
comment
Вы должны объяснить, что оба они означают. - person Bernhard Barker; 28.06.2015
comment
x и y сравниваются, а затем результат сравнения (логическое значение) сравнивается с z, я прав? - person Toumash; 28.06.2015
comment
@ Тумаш, да, ты. Логический результат преобразуется в целое число, равное 0 или 1, и сравнивается с другой переменной. Не уверен, что указан порядок оценки, но это определенно не то, что задумано! - person Robin Hartland; 29.06.2015

Выражение if (x == y == z) оценивается как false.

Представьте, что x, y и z содержат значение 2:

Поскольку тогда (x == y) равно true / 1. А z содержит значение 2, оператор if проверит:

if ((x == y) == z)
//     1   ==   2

Что становится:

if (1 == 2) {} // false

Вы можете исправить это, выполнив следующие действия:

if ((x == y) && (y == z)) { /* ... */ }
person Andreas DM    schedule 28.06.2015

Вам следует использовать логические операторы.

выражение x == y == z неверно.
нужно сделать так.

if((x == y) && (y == z)) {    //or... if ((x == y) == z)
//your code goes here...
}

Подробнее о логических операторах здесь.

person marc_s    schedule 29.06.2015