Оригінальне питання "чому?"
Причина полягає в тому, що визначення буквального символу еволюціонувало та змінювалося, намагаючись залишатися назад сумісним з існуючим кодом.
У темні дні раннього С типів взагалі не було. На той момент, коли я вперше навчився програмувати на C, типи були введені, але функції не мали прототипів, щоб сказати абоненту, що таке типи аргументів. Натомість було стандартизовано, що все, що передається як параметр, буде або розміром з int (сюди включаються всі вказівники), або буде подвійним.
Це означало, що під час написання функції всі параметри, які не були подвійними, зберігалися в стеці як ints, незалежно від того, як ви їх оголосили, і компілятор поставив код у функцію, щоб це обробити для вас.
Це зробило речі дещо непослідовними, тому коли K&R писала свою відому книгу, вони встановлювали правило, що літеральний символ завжди буде переведений на int у будь-якому виразі, а не лише у функціональному параметрі.
Коли комітет ANSI вперше стандартизував C, вони змінили це правило, щоб буквальний символ був би просто int, оскільки це здавалося більш простим способом досягнення того ж самого.
Коли C ++ розроблявся, всі функції повинні були мати повноцінні прототипи (це все ще не потрібно в C, хоча воно є загальноприйнятим як хороша практика). Через це було вирішено, що літеральний символ може зберігатися в картці. Перевага цього в C ++ полягає в тому, що функції з параметром char та функції з параметром int мають різні підписи. Ця перевага не стосується C.
Ось чому вони різні. Еволюція ...