Как printf работает в случае несоответствия типа с спецификатором типа?

int main() { printf("%c", "\n"); return 0; } 

Здесь в соответствии с спецификатором типа требуется символ. Но мы передаем его const char * . Я надеялся, что это даст мне предупреждение в блоках кода GNU GCC, но это не дает мне предупреждения и печати символа $ .

почему он не дает никаких предупреждений?

Вы могли видеть, что код также работает с спецификаторами формата% d,% x,% u.

Почему он работает без каких-либо предупреждений?

Потому что у вас нет предупреждений в ваших CodeBlocks.

 Go to settings -> compiler and check Enable All Common Compiler Warnings [-Wall] 

И теперь вы получаете:

 In function 'int main()': warning: format '%c' expects argument of type 'int', but argument 2 has type 'const char*' [-Wformat=]| 

Почему он работает?

С% c, $ – вывод в CodeBlocks, X – результат в Visual Studio. Таким образом, это звучит как неопределенное поведение.

Неверные спецификаторы формата в scanf (или) printf

В любом случае, если вы хотите первый символ таким образом, вы можете сделать это:

 #include  int main() { printf("%c", *"Hello\n"); // Not asked in Question but still :) return 0; } 

Он печатает H путем разыменования указателя const.

Вам необходимо включить это предупреждение.

Компиляция вашего кода как test.cpp и добавление #include для printf с правильным флагом предупреждения в gcc 4.7.2:

 $ gcc -c -Wformat test.cpp test.cpp: In function 'int main()': test.cpp:5:18: warning: format '%c' expects argument of type 'int', but argument 2 has type 'const char*' [-Wformat] 

С printf() если существует несоответствие типа, это приводит к неопределенному поведению.

Спецификатор формата должен соответствовать типу, который вы хотите распечатать.

Далее количество аргументов должно совпадать с числом нарушителей формата, которое нарушает, что также приведет к неопределенному поведению.

Просто добавьте -Wall при компиляции кода вы получите -Wall ошибку:

warning: format% c ожидает тип int, но аргумент 2 имеет тип char *