Что такое & & & & операция в C [закрыто]


int main()
{
        int i, c;
i:
        for (i = 0; i < 3; i++) {
                c = i &&&& i;
                printf("%dn", c);
        }
        return 0;
}

Выходные данные вышеупомянутой программы, скомпилированной с использованием gcc, составляют

0
1
1

Как вычисляется c в приведенной выше программе?

2 4

2 ответа:

Использование меток в качестве значений является расширением gcc (см.здесь ). Ваш сегмент выражения:

c = i &&&& i;

Приравнивается к: с = Я && (&&я); где &&i - Адрес метки i.

Имейте в виду, что вы объединяете здесь два совершенно разных i "объекта". Первая-переменная i, которая циклически проходит через 0, 1, 2, а вторая-метка i, для которой адрес всегда является некоторым ненулевым значением.

Это означает, что результат, помещенный в C, будет быть 0 (false) только тогда, когда переменная i есть 0. Вот почему вы получаете последовательность 0, 1, 1.

В качестве отступления я серьезно подумываю о "практике управления персоналом", если один из моих приспешников купил мне такой код для производственного использования. Все, что устраняет возможность подобных чудовищ, было бы хорошо, на мой взгляд : -)

В этом случае он также разбирается как && и &&. Первый - это logical AND , а второй && - это адрес метки i, а не адрес переменной i. (это расширение gcc)

Это будет разбираться как c = (i) && (&&i); / / скобки просто, чтобы сделать его читаемым человеком.

& дает вам адрес переменной i. Который вы только что задали несколько минут назад в этом вопросе .

Подробнее об адресе метки и значениях смотрите этот gcc расширение.

EDIT : так как && логично и всегда следует за коротким замыканием оператора.Следовательно, в первом случае это будет 0, так как он нашел i=0, поэтому он не пойдет в &&i(Вторая часть логического выражения).

Но во всех последующих случаях i не является 0, поэтому он даст TRUE и перейдет к следующему выражению &&i, которое является адресом метки i (а адрес i всегда будет равен TRUE.)

Таким образом, результат полного выражение всегда будет TRUE означает 1, за исключением первого случая, когда i является 0. Следовательно, вы видите результат

0
1
1