Ответ 1
интегральная постоянная 0 также является константой нулевого указателя - ее можно сравнить с результатом ostream
operator void *
. Обратите внимание, что он будет терпеть неудачу, если константа имеет любое значение, но 0.
У меня есть этот код, и я много часов искал, почему он не смог распечатать мой доход.
int const income = 0;
std::cout << "I'm sorry, your income is: " < income;
До тех пор, пока я не обнаружил, что пропустил писать <<
, но написал <
. Почему компилятор не обнаруживает это и не выполняет ошибку? Я не уверен, почему сравнение cout
имеет смысл?
интегральная постоянная 0 также является константой нулевого указателя - ее можно сравнить с результатом ostream
operator void *
. Обратите внимание, что он будет терпеть неудачу, если константа имеет любое значение, но 0.
Когда я скомпилирует этот код с помощью GCC 4.3.4, я вижу предупреждение:
prog.cpp: In function ‘int main()’:
prog.cpp:6: warning: right-hand operand of comma has no effect
... хотя почему это предупреждение, а не ошибка, я не знаю.
РЕДАКТИРОВАТЬ: На самом деле, я не знаю, какую запятую он имеет в виду, потому что этот код:
int const income = 0;
std::cout << "I'm sorry your income is: " < income;
... генерирует одно и то же предупреждение (см. здесь).
Прототипы < оператор:
bool T::operator <(const T& b) const;
Итак, я думаю, что компилятор транслирует аргумент как тип этого экземпляра. Включили ли вы все предупреждения, такие как -Wall
Он компилируется с помощью g++ 4.4.3
#include <iostream>
int main (void)
{
int const income = 0;
std::cout << "I'm sorry, your income is: " < income;
}
Однако при запуске с -Wall (хорошая практика!) у меня появилось смешное сообщение:
:~/stack$ g++ test.cpp -o temp
:~/stack$ g++ -Wall test.cpp -o temp
test.cpp: In function 'int main()':
test.cpp:5: warning: right-hand operand of comma has no effect
Не знаю, что он на самом деле делает (или пытается сделать)...