несколько выражений в условии (C / C ++) - PullRequest
3 голосов
/ 02 апреля 2012

Я хочу убедиться, что все 3 условия приводят к одному и тому же ответу перед выполнением блока управления:

#include <iostream>
#include <cstdlib>

int main(){

    ///BUT THIS DOES NOT WORK!
    if ( (2 + 2) == (1 + 3) == (4 + 0) ){
        std::cout << "not executed" << std::endl;
    }

    return EXIT_SUCCESS;
}

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

#include <iostream>
#include <cstdlib>

int main(){

    int n1 = 2;
    int n2 = 2;
    int n3 = 1;
    int n4 = 3;
    int n5 = 4;
    int n6 = 0;

    int a = n1 + n2;

    ///this works
    if ( (n3 + n4) == a && (n5 + n6) == a){
        std::cout << "executed!" << std::endl;
    }

    return EXIT_SUCCESS;
}

вопрос: почему мой первый пример не работает?

Я могу присвоить нескольким переменным одно и то же значение, например так:

#include <iostream>
#include <cstdlib>

int main(){

    int a,b,c,d;
    a=b=c=d=9;

    ///prints: 9999
    std::cout <<a<<b<<c<<d<<'\n';

    return EXIT_SUCCESS;
}

в надежде, что кто-нибудь сможет объяснить, почему этот метод оценки не работает.
Недавно он привлек мое внимание при написании оператора if, который определяет, является ли массив nxn магическим квадратом или нет.

Ответы [ 2 ]

12 голосов
/ 02 апреля 2012

(2 + 2) == (1 + 3) == (4 + 0)

Во-первых, (2 + 2) == (1 + 3) оценивается как true, потому что оно действительно содержит 4 == 4.

Затем вы сравниваете true == (4 + 0). В этом случае логические значения преобразуются в целые числа:

true -> 1
false -> 0

Поэтому вы сравниваете 1 == 4, что приводит к ложному.

1 голос
/ 02 апреля 2012

Эта часть приводит к логическому или целому числу, 0 или 1:

(2 + 2) == (1 + 3)

Итак, остальная часть выражения выглядит так:

1 == (4 + 0)

или

0 == (4 + 0)

Ни один из них не является правильным.

Единственный оператор, который принимает три аргумента, это оператор foo ? bar : baz. Все остальное принимает один или два аргумента.

...