Как следующий c выводит мусор? - PullRequest
0 голосов
/ 18 апреля 2020
#include <stdio.h>

int main(void) {
   int d, a = 1 & 0 && (d=4);
   printf("%d\n", d);
   return 0;
}

В соответствии с оператором priority () оператор d должен быть назначен, но в вышеприведенной программе логически и выполняется первым. Значение d не присваивается 4. Пожалуйста, кто-нибудь, помогите мне понять вышеупомянутую программу. Я пробовал с g cc и некоторыми онлайн-компиляторами

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Давайте сначала посмотрим на f() + g() * h().

Старшинство и ассоциативность определяют, что является операндом чего. Например, C приоритет оператора и ассоциативность говорит нам, что

f() + g() * h()

означает

f() + ( g() * h() )     # * has higher precedence than +

, а не

( f() + g() ) * h()     # If + had higher precedence than *

Примечательно , приоритет не определяет порядок, в котором вычисляются операнды. В нашем примере три функции могут быть вызваны в любом порядке, если результат g() и результат h() умножаются вместе, и что результат умножения добавляется к результату f().


Назад к

1 & 0 && ( d = 4 )

Приоритетность и ассоциативность просто говорят нам, что выше эквивалентно следующему:

( 1 & 0 ) && ( d = 4 )    # & has higher precedence than &&

Так, что это делает?

&& диктует, что его правая часть оценивается только если его левая часть верна. Это называется оценка короткого замыкания или короткое замыкание.

1 & 0 ложно, поэтому d = 4 никогда не оценивается. Это оставляет d неизменным и, таким образом, неинициализированным.

1 голос
/ 18 апреля 2020
  • 1 & 0 && (d=4) оценивается так: (1 & 0) && (d=4)
  • (1 & 0) равно 0
  • из-за короткого замыкания в правой части && оператор не оценивается
  • поэтому d=4 никогда не оценивается
  • поэтому d никогда не присваивается
  • и поэтому d содержит мусор, поскольку локальные переменные не инициализировано

Если вы измените int d на int d = 42, результат вашей программы будет 42

...