Чому C та C ++ дозволяють вираз (int) + 4 * 5?


86
(int) + 4*5;

Чому це можливо (додавання типу зі значенням) ? (спробували з g ++ та gcc.)

Я знаю, що це не має сенсу (і не має ніякого ефекту), але я хочу знати, чому це можливо.


19
те саме, що(int)-4*5
P__J підтримує жінок у Польщі

45
Існує корисний інструмент, cppinsightsякий допомагає зрозуміти, як виглядає код з точки зору інтерфейсу компілятора. Він також має онлайн-версію, ви можете побачити, що він розповідає про ваш приклад (та сама `` дужка '', що і відповіді, які вам дали)
Микита Князєв,

22
Це твердження еквівалентно +(int)+ 4*5;і, -(int)- 4*5;і, -+-+-(int)-+-+- 4*5;і менш поетично;
chqrlie

16
Яка частина вас загадує? Наскільки я знаю, ви запитуєте, чому вам дозволено написати 5, не вказуючи знак.
Карстен С

5
Чи не повинен C ++ попередити вас, що в C ++ не рекомендується використовувати приведення типу C?
Містер Лістер,

Відповіді:


141

+Тут унарний +оператор , а НЕ бінарний оператор додавання . Тут ніяких додатків не відбувається.

Крім того, синтаксис (int)використовується для випуску тексту.

Ви можете перечитати це твердження як

(int) (+ 4) * 5;    

який розбирається як

((int) (+ 4)) * (5);    

що говорить,

  1. Застосувати одинарний +оператор до цілочисельного значення константи 4.
  2. typecast до int
  3. помножити на операнд 5

Це схоже на те (int) (- 4) * (5);, де використання одинарного оператора є більш звичним.

У вашому випадку одинарний +і акторський склад int- обидва непотрібні.


50
"Кастинг", а не "наведення тексту". Набір шрифтів - це те, що трапляється з акторами.
Кіт Томпсон,

8
(+ 4)не робить операндом+4 , це означає застосувати одинарний +до операнда 4, що дійсно є невдалим у випадку OP, але може спричинити цілочисельне просування або розпад масиву за інших обставин. Наприклад, char c = 0; sizeof +c == sizeof cце, мабуть, помилково і sizeof +"a", мабуть, не 2.
chqrlie

7
"обидва зайві" - все це 42;
зайве

11
Я не бачу нічого поганого у використанні терміна Type Casting. Здається, я не єдиний .
Бен,

14
@Ben Typecasting - це не кастинг типів.
Кеннет К.

40

Це трактується як ((int)(+4)) * 5. Тобто вираз +4(одинарний плюс-оператор, застосований до літералу 4), переданий для введення intз використанням стилю C, а результат помножений на 5.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.