Что такое & & & & операция в 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 ответа:
Использование меток в качестве значений является расширением
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