В C (x==y==z) ведет себя так, как я ожидал?

Могу ли я сравнить три переменные, как показано ниже, вместо выполнения if((x==y)&&(y==z)&&(z=x))? [Инструкция if должна выполняться, если все три переменные имеют одинаковое значение. Это логические значения.]

if(debounceATnow == debounceATlast == debounceATlastlast)
{
 debounceANew = debounceATnow;
}
else
{
 debounceANew = debounceAOld;
}

person Isaac    schedule 07.12.2010    source источник
comment
-1 за то, что не потратил 30 секунд на написание тестовой программы, чтобы выяснить это.   -  person PP.    schedule 07.12.2010
comment
./пожимая плечами Меня больше интересует, почему это не работает. Спасибо всем.   -  person Isaac    schedule 07.12.2010


Ответы (3)


Нет, это не так.

x == y преобразуется в int, дает 0 или 1, и результат сравнивается с z. Таким образом, x==y==z даст истину тогда и только тогда, когда (x is equal to y and z is 1) or (x is not equal to y and z is 0)

Что вы хотите сделать, это

if(x == y && x == z)
person Armen Tsirunyan    schedule 07.12.2010
comment
Я почти думаю, что gcc должен генерировать предупреждение для этого, но опять же, если вы пишете x==y==z, это, кажется, указывает на то, что вы либо совсем не знаете C, либо вы бог код-гольфа... - person R.. GitHub STOP HELPING ICE; 07.12.2010
comment
Спасибо. Я ценю помощь. - person Isaac; 07.12.2010
comment
При компиляции с -Wall gcc выдает предупреждение для такой конструкции: warning: suggest parentheses around comparison in operand of ‘==’ - person Kamal; 07.12.2010
comment
@Армен Цирунян Не знал, что я могу это сделать. - person Isaac; 07.12.2010
comment
@R.., что касается игры в гольф: x^y^z короче на два символа. - person A. Rex; 08.12.2010
comment
@A.Rex: да, но это не то же самое, что x==y==z, как указал Армен. Я полагаю, что единственным использованием x==y==z может быть какой-то неясный код-гольф, где z на самом деле является логическим значением... :-) - person R.. GitHub STOP HELPING ICE; 08.12.2010
comment
@R..: Я имею в виду, что x==y==z совпадает с x^y^z, если x, y и z являются логическими (контекст OP) или, как известно, уже равны 0 или 1. - person A. Rex; 08.12.2010

Нет. Проверка равенства связывает слева, и логический результат сравнивается как число, так что выражение 2 == 2 == 1 анализируется как (2 == 2) == 1, что, в свою очередь, дает 1 == 1 и приводит к 1, что, вероятно, не то, что вам нужно.

person zoul    schedule 07.12.2010

На самом деле вы можете ввести что-то вроде этого:

int main()
{
        const int first = 27,
                  second = first,
                  third = second,
                  fourth = third;
        if (!((first & second & third) ^ fourth))
            return 1;
        return 0;
}
person mesmerizingr    schedule 26.04.2012