Унарный + оператор на инт & - PullRequest
       23

Унарный + оператор на инт &

1 голос
/ 07 февраля 2012

У меня есть следующее утверждение, и оно компилируется:

static unsigned char CMD[5] = {0x10,0x03,0x04,0x05,0x06};

int Class::functionA(int *buflen)
{
    ...
    int length = sizeof(CMD); + *buflen; // compiler should cry! why not?
    ...
}

Почему я не получаю ошибку компилятора?

Ответы [ 3 ]

8 голосов
/ 07 февраля 2012
+ *buflen;

Является допустимым приложением унарного оператора + на int&, это в основном noop. Это так же, как если бы вы написали это:

int i = 5;
+i; // noop

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

4 голосов
/ 07 февраля 2012

Я думаю, из заголовка этого вопроса "После точки с запятой другая команда и она компилируется", что вы думаете, что в строке может быть только одна команда / оператор?

Как вы заметили, это неверно. C ++ и C являются языками свободной формы (что означает, что вы можете расположить символы любым удобным для вас способом). Точка с запятой - это просто терминатор оператора.

Вы можете написать foo();bar(); или

foo();
bar();

Обе (и более) договоренности в порядке. Кстати, это особенность, а не ошибка. Некоторые языки (Python, ранний Fortran) не имеют этого свойства.

Как правильно отметили другие, ваше конкретное утверждение - это бездействие, утверждение без какого-либо эффекта. Некоторые компиляторы могут предупредить вас об этом, но ни один компилятор не предупредит вас о нескольких операторах в одной строке.

4 голосов
/ 07 февраля 2012

Поскольку это не так, просто утверждение без эффекта.

Если вы скомпилируете (gcc / g ++) с флагом -Wall, вы увидите.

...