Почему 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 без указания знака.
Carsten S
5
Разве C ++ не должен предупреждать вас о том, что приведение типов C в C ++ не рекомендуется?
Мистер Листер

Ответы:

141

+Здесь унарный +оператор , а не бинарный оператор сложения . Здесь ничего не происходит.

Также синтаксис (int)используется для приведения типов.

Вы можете перечитать это заявление как

(int) (+ 4) * 5;    

который разбирается как

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

который говорит,

  1. Примените унарный +оператор к целочисленному постоянному значению 4.
  2. приведение типа к 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;:-)
paxdiablo
11
Я не вижу ничего плохого в использовании термина "приведение типов". Кажется, я не один такой .
Бен
14
@Ben Приведение типов - это не приведение типов.
Kenneth K.
40

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

Игорь Тандетник
источник