Я не в состоянии придать отдельный смысл ^
с помощью #define
, лайк #define ^ +
,
Но где, как я могу придать смысл $
с помощью #define
, лайк #define $ +
,
Не могли бы вы, пожалуйста, дайте мне знать, как $
отличается от ^
?
По какому правилу стандарта c ++ это ^
не допускается?
Я использую VC ++ 2012, не пробовал с GCC или любым другим инструментом.
^
является оператором в C ++. Это побитовый XOR. Пожалуйста, прочитайте https://www.tutorialspoint.com/cplusplus/cpp_operators.htm
Операторы не могут быть «переопределены» таким образом, их нужно перегрузить. C ++ позволяет указывать более одного определения для имени функции или оператора в одной и той же области видимости, что называется перегрузкой функции и перегрузкой оператора соответственно (https://www.tutorialspoint.com/cplusplus/cpp_overloading.htm
а также https://en.wikibooks.org/wiki/C%2B%2B_Programming/Operators/Operator_Overloading#Bitwise_operators)
Для побитовых операторов, как правило, они имеют более низкий приоритет, чем арифметические операторы, поэтому, если ^ будет перегружен для возведения в степень, x ^ y + z может работать не так, как ожидалось.
Для XOR каноническая форма: Type operator^(const Type &lhs, const Type &rhs); // Bitwise exclusive or
, а для версий функций-членов: Type &operator^=(const Type &rhs); // Assign exclusive or
,
ссылка: http://articles.emptycrate.com/2009/10/12/nobody_understands_c_part_8_operator_overloading.html
Правила для имен макросов препроцессора те же, что и для идентификаторов: они могут содержать только прописные и строчные буквы, подчеркивания и только цифры. Первый символ в идентификаторе не может быть цифрой.
Это означает, что невозможно использовать #define
переопределить значение таких операторов, как ^
,
В стандартном C ++ это также исключает идентификаторы, содержащие $
, Однако некоторые компиляторы поддерживают идентификаторы, содержащие $
как продолжение.
^ — это оператор, который вы можете использовать для получения ввода строк с пробелом, подобных этому scanf («% [^ \ n] s,&х) … Таким образом, вы можете только перегрузить его и не определять его, как он уже был определен