У меня есть две версии кода. Первый - использование переменной int
как части выражения для проверки условия, второй - использование целочисленной константы для одного и того же - оба представляют одно и то же целое значение - 24
.
1. код :
#include <stdio.h>
int main()
{
int var = 24;
if((!var) == NULL)
{
printf("1");
}
}
2. код :
#include <stdio.h>
int main()
{
if((!24) == NULL)
{
printf("1");
}
}
Когда я пытаюсь скомпилировать первую версию, я получаю предупреждение:
предупреждение: сравнение между указателем и целым числом
от g cc и
предупреждение: сравнение между указателем и целым числом ('int' и 'void *') [-Wpointer-integer-compare]
из clang.
Когда я компилирую почти эквивалентный код, используя то же значение, что и целочисленная константа, все в порядке. Почему?
Мои исследования до сих пор:
Я изучил C18 и обнаружил в разделе 6.4.4 «Константы»:
Сначала в подразделе / 2 и / 3:
" 2 - каждая константа должна иметь тип, а значение константы должно находиться в диапазоне представимых значений для ее типа. "
" 3 - У каждой константы есть тип, определяемый ее формой и значением, как описано позже. ".
И второй в подразделе / 5:
" Тип целочисленной константы является первым из соответствующего списка, в котором может быть представлено ее значение. "
Следующий список:
Таким образом, целочисленная константа без суффикса относительно представимого значения 24
должна иметь тип int
.
Я понимаю само предупреждение и знаю, что NULL
обычно в большинстве реализаций расширяется до (void*) 0
. Таким образом, разумно, что это предупреждение выдается.
Но почему предупреждение не возникает при использовании того же значения, что и целочисленная константа?