Что такое & & & & операция в 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