В исходном коде, в некоторых контекстах, переменные разных типов совместимы в данном выражении, и компилятор вызовет достаточно магии, чтобы сделать правильные / ожидаемые вещи, например, передать массив в качестве аргумента функции, ожидающей указатель.
Однако это не означает, что расположение памяти у них совместимо. См вопрос
Указатель против массива в C, нетривиальная разница , где я пропустил это.
Я не совсем уверен, что ваша книга подразумевает под "структурной эквивалентностью", но задаюсь вопросом, относится ли это к целочисленному продвижению по умолчанию (но, похоже, также включает массивы?). Но в любом случае целочисленное продвижение - это очень важный вопрос, и вы должны потратить время на понимание. Распечатка ниже должна быть выполнена в соответствии с этими правилами:
unsigned int i = 0;
if (i < -1) {
printf("This line is printed!\n");
}
Стандарт C (ISO / IEC 9899: 1990) содержит раздел с заголовком «обычные арифметические преобразования», определяющий поведение. Стандарт не находится в свободном доступе (напротив, он продается довольно дорого, поскольку стандарты ISO устанавливаются по цене за страницу ...), но если вы будете искать этот термин, вы сможете найти некоторую полезную информацию или цитаты. Некоторые проекты стандартов находятся в свободном доступе, однако представляют угрозу для тех, у кого большое недоверие, поскольку вы точно не знаете, что было изменено в окончательном стандарте.