C++ Недопустимые операнды для двоичного кода

Я новичок в C++, и у меня возникла проблема с этим кодом, который должен отображать результаты во время финала Суперкубка:

#include <iostream>

enum POINTS { EXTRA_POINT = 1, SAFETY = 2, FIELD_GOAL = 3, TOUCHDOWN =6 };

unsigned short giantsScore = 0, patriotsScore = 0;

int main()
{
std::cout << " Giants: " << giantsScore << "\n";
std::cout << " Patriots: " << patriotsScore << "\n\n";

std::cout << " Giants: " << giantsScore = giantsScore + SAFETY << "\n";
std::cout << " Patriots: " << patriotsScore << "\n\n"; 

std::cout << " Giants: " << giantsScore = giantsScore + TOUCHDOWN + EXTRA_POINT << "\n";
std::cout << " Patriots: " << patriotsScore << "\n\n";

std::cout << " Giants: " << giantsScore << "\n";
std::cout << " Patriots: " << patriotsScore = patriotsScore + FIELD_GOAL << "\n\n";

std::cout << " Giants: " << giantsScore << "\n";
std::cout << " Patriots: " << patriotsScore = patriotsScore + TOUCHDOWN + EXTRA_POINT << "\n\n";

std::cout << " Giants: " << giantsScore << "\n";
std::cout << " Patriots: " << patriotsScore = patriotsScore + TOUCHDOWN + EXTRA_POINT  << "\n\n";

std::cout << " Giants: " << giantsScore = giantsScore + FIELD_GOAL << "\n";
std::cout << " Patriots: " << patriotsScore << "\n\n";

std::cout << " Giants: " <<  giantsScore = giantsScore + FIELD_GOAL << "\n";
std::cout << " Patriots: " << patriotsScore << "\n\n";

std::cout << " Giants: " << giantsScore << "\n";
std::cout << " Patriots: " << patriotsScore = patriotsScore + FIELD_GOAL + EXTRA_POINT  << "\n\n";

return 0;
}

Не обращая внимания на то, что это довольно неэлегантно, когда я запускаю это через компилятор G++, я получаю сообщение об ошибке

ошибка: недопустимые операнды типов 'int' и 'const char [2]' для двоичного 'operator‹‹'

Если я удаляю константы и добавляю их перед каждым std::cout, то все работает нормально. Я просто хотел знать, почему я не могу добавлять константы в каждую строку вывода?


person MadMonty    schedule 06.06.2012    source источник


Ответы (2)


В вашем сообщении об ошибке указано: int << char, что, конечно, является странной операцией.

Это связано с приоритетами оператора.

У каждого оператора есть приоритет, означающий, что он будет оцениваться до или после оценки других операторов.

+ оценивает перед =

и << следует оценивать после того, как = было cout<<"stuff" его первоначальной целью.

<< изначально является оператором сдвига битов (до сих пор), поэтому вы испытываете такое странное поведение. Добавьте скобки, и все будет хорошо.

person Captain Giraffe    schedule 06.06.2012
comment
Просто вставьте скобки, и теперь все работает так, как я хотел, спасибо! Итак, просто чтобы уточнить, приведенный выше код не работает, потому что оператор сдвига бит оценивается перед оператором =? Спасибо еще раз! - person MadMonty; 07.06.2012

Проверьте http://cs.smu.ca/~porter/csc/ref/cpp_operators.html для обзора правил приоритета операторов. Когда вы пишете это:

std::cout << " Patriots: " << patriotsScore = patriotsScore + FIELD_GOAL + EXTRA_POINT  << "\n\n";

Тогда в соответствии с правилами приоритета оператор + будет выполнен первым, что даст вам следующее:

std::cout << " Patriots: " << patriotsScore = result  << "\n\n";

Затем выполняется оператор ‹‹, что также означает `result ‹‹ "\n\n". Но этот оператор не определен между int и char[2].

Чтобы решить вашу проблему, заключите операцию присваивания в круглые скобки, например:

std::cout << " Patriots: " << (patriotsScore = patriotsScore + FIELD_GOAL + EXTRA_POINT)  << "\n\n";
person Patrick    schedule 06.06.2012
comment
Или еще лучше: ПОСТАВЬТЕ ЭТО НА ДРУГОЙ ЛИНИИ - person Mooing Duck; 07.06.2012