2012-03-15 2 views
1

Следующие принты код -10Как следующий код компилируется в C/C++?

int x = 10; 
-x; 
cout << -x << endl; // printf("%d\n", -x); 

как в С и С ++ компиляторов (gcc 4.1.2). Я ожидал ошибку компилятора для второй строки. Может быть, это что-то фундаментальное, но я не понимаю поведения. Может ли кто-нибудь объяснить это?

Thanks

+2

'-x;' отрицает x и отбрасывает результат. как, например, 'x + 1;' – Anycorn

+3

Обратите внимание, что в этом случае компилятор, скорее всего, оптимизирует все выражение, так как оно не имеет никакого эффекта. Собственно, я ожидал бы, что любой достойный компилятор предупредит вас о неиспользованности такого заявления. – ereOn

+0

Да, когда я даю -Wall, я получаю предупреждение: «заявление не действует» – Sanish

ответ

11

Заявления могут быть выражениями. Такие утверждения отбрасывают результат выражения и оценивают выражение для его побочных эффектов.

-x; вычисляет отрицание x и отбрасывает результат.

Для получения дополнительной информации см. [stmt.expr] в стандарте C++.

+0

спасибо за указание [stmt.expr] в стандарте – Sanish

1

Когда вы делаете -x;, operator - предварительно сформирован на переменной.
Оператор возвращает значение отрицания, но не изменяет сам объект.

Так как вы не сохраняете результат оператора, то x сам по себе имеет такое же значение.

При печати -x к cout, вы видите результат operator -, который возвращается к operator <<

+0

' operator-'не используется для встроенных типов, таких как' int'. – Pubby

1

C++ не оператор присваивания, или заявление вызова процедуры. Он определяет назначение как оператор в выражении, с боковыми эффектами , и имеет оператор выражения. Ожидается, что оператор верхнего уровня в операторе выражения имеет сторону эффектов —, что он либо модифицирует состояние, как оператор присваивания, , либо вызывает функцию. Но язык этого не требует, и выражения выражения выражения без каких-либо побочных эффектов.

Хороший компилятор будет выдавать предупреждение в таких случаях, так как это почти , конечно, ошибка программиста (и вы можете обычно заткнуться предупреждением путем явно заливкой результатов void, если по какой-то причине вы хотите таких заявление — макрос assert часто делает это).

0

Вторая строка не влияет на x, но вычисляется. Третий не влияет на x, но вычисленный выход отправляется на стандартный вывод std::cout. Для того, чтобы сделать вещи немного проще понять:

int x=10; 
std::cout << x-10 << std::endl; 
std::cout << x << std::endl; 

выведет и .