Первая строка объявляет переменную 'x' типа 'int' и присваивает числовому литеральному значению 44 этой переменной.
int x = 44;
Следующая строка (2) объявляет переменную 'p' типа 'указатель на int' и присваивает значение выражения '& x' (который является адресом x, указатель на int),
int *p = &x;
Следующая строка (3) объявляет переменную 't' типа указатель на, указатель на int (указатель, который содержит указатель на тип int), и назначает выражение '& p' (которое является адресом) p, указатель на int,
int **t = &p;
Переменная t является «двунаправленным указателем».
Теперь наступает «хитрая часть».
Следующая строка (4) объявляет переменную 'a', которая является переменной bool (ean) (true / false), и присваивает значение выражения в правой части ('справа),' (* t = & x ) '. Скобки предназначены для того, чтобы обеспечить соблюдение предполагаемого порядка приоритета. Поэтому мы оцениваем выражение' * t = & x '.
bool a = (*t = &x);
Здесь часть 'хитрая', предоставленный код имеет оператор присваивания '='! Если бы это было сравнение, то появился бы оператор '=='. Таким образом, этот оператор берет адрес x (указатель на int) и сохраняет его в * t (местоположение, на которое указывает t, и это указатель на int).
Если бы это сравнение, выражение сравнивало бы те же значения, и было бы верно. Но это задание. И выражение присваивания возвращает присвоенное значение, которое является адресом x (указатель на x). В большинстве систем этот указатель является местом в памяти (и может быть нулевым (NULL), если переменная была сохранена по нулевому адресу).
Выражение имеет тип указатель на int, но преобразуется (приводится) в тип bool. Поскольку C рассматривает false = 0 и true, если все не равно 0, значение преобразуется из (вероятно, не NULL) указателя в int в bool (true).
Если бы круглые скобки были опущены, то назначение все равно происходило бы (порядок оценки оператора присваивания справа налево), но тогда происходило бы приведение. Но удалите скобки, скомпилируйте их и посмотрите, что говорит ваш компилятор.