我无法使用^
#define
给#define ^ +
提供单独的含义,例如$
。
但是,我可以使用#define
向#define $ +
赋予$
含义,例如^
。
您能告诉我^
与select
artist_id
from
service_schedule
group by
artist_id
having
sum(service_id in (5,6,1))=3
的不同之处吗?
关于c ++标准的规则,这个service_id in (5,6,1)
是不允许的?
我使用的是VC ++ 2012,未尝试使用GCC或任何其他工具。
答案 0 :(得分:4)
^
是C ++中的运算符。这是一个按位异或。请阅读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
答案 1 :(得分:3)
预处理器宏的名称规则与标识符的规则相同:它们只能包含大写和小写字母,下划线和数字。标识符中的第一个字符不能是数字。
这意味着无法使用#define
重新定义^
等运算符的含义。
在标准C ++中,这也排除了包含$
的标识符。但是,某些编译器支持包含$
作为扩展名的标识符。
答案 2 :(得分:-2)
^是一个操作符,你可以使用它来获取带有空格的字符串输入,就像这个scanf(“%[^ \ n] s,& x)...所以你只能重载它而不是将它定义为它已定义