C和C++运算符 (转)
这里是C和C++语言的运算符列表。所有列出的运算符皆含纳于C++;第三个栏目里的内容也使用C来描述。应当注意的是C不支持运算符重载。
下列运算符在两个语言中都是顺序点(运算符未重载时): &&、||、?: 和 ,(逗号运算符)。
C++也包含类型转换运算符const_cast、static_cast、dynamic_cast和reinterpret_cast,不在表中列出以维持简洁。类型转换运算符需要在表达式中明确使用括号,因此并不存在优先级的问题。
在C里有的运算符,除了逗号运算符和箭头记头的运算符以外,在Java、Perl、C#和PHP同样也有相同的优先级、结合性和语义。
运算符优先级
优先级 | 运算符 | 叙述 | 示例 | 重载性 | 结合性 |
---|---|---|---|---|---|
1 |
:: |
作用域解析(C++专有) | Class::age = 2; |
否 | 由左至右 |
2 |
++ |
后缀递增 | i++ | ||
-- |
后缀递减 | i-- | |||
{} |
组合 | {i++;a*=i;} | |||
() |
函数调用或变量初始化 | c_tor(int x, int y) : _x(x), _y(y * 10) {} | |||
[] |
数组访问 | array[4] = 2; | |||
. |
以对象方式访问成员 | obj.age = 34; | 否 | ||
-> |
以指针方式访问成员 | ptr->age = 34; | |||
dynamic_cast |
运行时检查类型转换(C++专有) | Y& y = dynamic_cast<Y&>(x); | 否 | ||
static_cast |
未经检查的类型转换(C++专有) | Y& y = static_cast<Y&>(x); | 否 | ||
reinterpret_cast |
重定义类型转换(C++专有) | int const* p = reinterpret_cast<int const*>(0x1234); | 否 | ||
const_cast |
更改非常量属性(C++专有) | int* q = const_cast<int*>(p); | 否 | ||
typeid |
获取类型信息(C++专有) | std::type_info const& t = typeid(x); | 否 | ||
3 |
++ |
前缀递增 | ++i | 由右至左 | |
-- |
前缀递减 | --i | |||
+ |
一元正号 | int i = +1; | |||
- |
一元负号 | int i = -1; | |||
! not |
逻辑非! 的备用拼写 |
if (!done) … | |||
~ compl |
按位取反~ 的备用拼写 |
flag1 = ~flag2; | |||
(type) |
强制类型转换 | int i = (int)floatNum; | |||
* |
取指针指向的值 | int data = *intPtr; | |||
& |
取变量的地址 | int *intPtr = &data; | |||
sizeof |
某某的大小 | size_t s = sizeof(int); | 否 | ||
new |
动态内存分配(C++专有) | long* pVar = new long; | |||
new[] |
动态数组内存分配(C++专有) | long* array = new long[20]; | |||
delete |
动态内存释放(C++专有) | delete pVar; | |||
delete[] |
动态数组内存释放(C++专有) | delete [] array; | |||
4 |
.* |
成员对象选择(C++专有) | obj.*var = 24; | 否 | 由左至右 |
->* |
成员指针选择(C++专有) | ptr->*var = 24; | |||
5 |
* |
乘法 | int i = 2 * 4; | ||
/ |
除法 | float f = 10.0 / 3.0; | |||
% |
模数(取余) | int rem = 4 % 3; | |||
6 |
+ |
加法 | int i = 2 + 3; | ||
- |
减法 | int i = 5 - 1; | |||
7 |
<< |
比特左移 | int flags = 33 << 1; | ||
>> |
比特右移 | int flags = 33 >> 1; | |||
8 |
< |
小于关系 | if (i < 42) … | ||
<= |
小于等于关系 | if (i <= 42) ... | |||
> |
大于关系 | if (i > 42) … | |||
>= |
大于等于关系 | if (i >= 42) ... | |||
9 |
== eq |
等于关系== 的备用拼写 |
if (i == 42) ... | ||
!= not_eq |
不等于关系!= 的备用拼写 |
if (i != 42) … | |||
10 |
& bitand |
比特 AND& 的备用拼写 |
flag1 = flag2 & 42; | ||
11 |
^ xor |
比特 XOR(独占or)^ 的备用拼写 |
flag1 = flag2 ^ 42; | ||
12 |
| bitor |
比特 OR(包含or)| 的备用拼写 |
flag1 = flag2 | 42; | ||
13 |
&& and |
逻辑 AND&& 的备用拼写 |
if (conditionA && conditionB) … | ||
14 |
|| or |
逻辑 OR|| 的备用拼写 |
if (conditionA || conditionB) ... | ||
15 |
c?t:f |
三元条件运算 | int i = a > b ? a : b; | 否 | 由右至左 |
16 |
= |
直接赋值 | int a = b; | ||
+= |
以和赋值 | a += 3; | |||
-= |
以差赋值 | b -= 4; | |||
*= |
以乘赋值 | a *= 5; | |||
/= |
以除赋值 | a /= 2; | |||
%= |
以取余数赋值 | a %= 3; | |||
<<= |
以比特左移赋值 | flags <<= 2; | |||
>>= |
以比特右移赋值 | flags >>= 2; | |||
&= and_eq |
以比特AND赋值&= 的备用拼写 |
flags &= new_flags; | |||
^= xor_eq |
以比特XOR赋值^= 的备用拼写 |
flags ^= new_flags; | |||
|= or_eq |
以比特OR赋值|= 的备用拼写 |
flags |= new_flags; | |||
17 |
throw |
抛出异常 | throw EClass(“Message”); | 否 | |
18 |
, |
逗号运算符 | for (i = 0, j = 0; i < 10; i++, j++) … | 由左至右 |
列表
在本表中,a
、b
和c
代表有效值(来自变量或返回值的逐字常数或数值)、对象名称,或适当的左值。
算术运算符[编辑] |
|||
运算符名称 | 语法 | 可重载 | C里有 |
---|---|---|---|
一元正号 | +a |
是 | 是 |
加法(总和) | a + b |
是 | 是 |
前缀递增 | ++a |
是 | 是 |
后缀递增 | a++ |
是 | 是 |
以加法赋值 | a += b |
是 | 是 |
一元负号(取反) | -a |
是 | 是 |
减法(差) | a - b |
是 | 是 |
前缀递减 | --a |
是 | 是 |
后缀递减 | a-- |
是 | 是 |
以减法赋值 | a -= b |
是 | 是 |
乘法(乘积) | a * b |
是 | 是 |
以乘法赋值 | a *= b |
是 | 是 |
除法(分之) | a / b |
是 | 是 |
以除法赋值 | a /= b |
是 | 是 |
模数(余数) | a % b |
是 | 是 |
以模数赋值 | a %= b |
是 | 是 |
比较运算符[编辑] |
|||
运算符名称 | 语法 | 可重载 | C里有 |
小于 | a < b |
是 | 是 |
小于或等于 | a <= b |
是 | 是 |
大于 | a > b |
是 | 是 |
大于或等于 | a >= b |
是 | 是 |
不等于 | a != b |
是 | 是 |
等于 | a == b |
是 | 是 |
逻辑取反 | !a |
是 | 是 |
逻辑 AND | a && b |
是 | 是 |
逻辑 OR | a || b |
是 | 是 |
比特运算符[编辑] |
|||
运算符名称 | 语法 | 可重载 | C里有 |
比特左移 | a << b |
是 | 是 |
以比特左移赋值 | a <<= b |
是 | 是 |
比特右移 | a >> b |
是 | 是 |
以比特右移赋值 | a >>= b |
是 | 是 |
比特一的补数 | ~a |
是 | 是 |
比特 AND | a & b |
是 | 是 |
以比特 AND 赋值 | a &= b |
是 | 是 |
比特 OR | a | b |
是 | 是 |
以比特 OR 赋值 | a |= b |
是 | 是 |
比特 XOR | a ^ b |
是 | 是 |
以比特 XOR 赋值 | a ^= b |
是 | 是 |
其它运算符[编辑] |
|||
运算符名称 | 语法 | 可重载 | C里有 |
基本赋值 | a = b |
是 | 是 |
函数调用 | a() |
是 | 是 |
数组下标 | a[b] |
是 | 是 |
间接(向下参考) | *a |
是 | 是 |
的地址(参考) | &a |
是 | 是 |
成员指针 | a->b |
是 | 是 |
成员 | a.b |
否 | 是 |
间接成员指针 | a->*b |
是 | 否 |
间接成员 | a.*b |
否 | 否 |
转换 | (type) a |
是 | 是 |
逗号 | a , b |
是 | 是 |
三元条件 | a ? b : c |
否 | 是 |
作用域解析 | a::b |
否 | 否 |
的大小 | sizeof a |
否 | 是 |
类型识别 | typeid type |
否 | 否 |
分配存储区 | new type |
是 | 否 |
解除分配存储区 | delete a |
是 | 否 |
语言扩展[编辑]
运算符名称 | 语法 | 可重载 | C里有 | 提供者 |
---|---|---|---|---|
标签值 | && label |
否 | 是 | GCC |
取得型态 | typeof a typeof(expr) |
否 | 是 | GCC |
最小/最大值 | a <? b a >? b |
否 | 否 | GCC |
注解[编辑]
在C和C++中对运算符的约束,是语言的语法规范因素所指定的(在对应的标准中),而不是优先级列表。这造成了一些微妙的冲突。例如,在C中,条件表达式的语法是:
邏輯-OR-表達式 ? 表達式 : 條件-表達式
在C++中则是:
邏輯-or-表達式 ? 表達式 : 賦值-表達式
因此,这个表达式:
e = a ? b : c = d
两个语言的语法分析结果并不相同。在C中,这个表达式被解析为:
e = ((a ? b : c) = d)
这是一个错误的语义,因为条件-表达式的结果并不是一个左值。在C++中,则解析为:
e = (a ? b : (c = d))
这是一个有效的表达式。
比特逻辑运算符的优先级一直受到批评[1]。在观念里,&和|是类似于+和*的数值运算符。但是,表达式
a & b == 7
意谓
a & (b == 7),
当
a + b == 7
意谓
(a + b) == 7。
这就需要经常使用圆括号,以免有意料之外的结果。
酉加运算符,可用于操作数表达式的类型提升。例如下例:
template <class T> void f(T const& a, T const& b){}; int main() {
int a[2];
int b[3];
f(a, b); // won't work! different values for "T"!
f(+a, +b); // works! T is "int*" both
}
C和C++运算符 (转)的更多相关文章
- shell运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用. expr 是一款表达式计算工具,使用它能完成表达式的求值操作. #!/bin/bash v ...
- SQL Server-聚焦APPLY运算符(二十七)
前言 其实有些新的特性在SQL Server早就已经出现过,但是若非系统的去学习数据库你会发现在实际项目中别人的SQL其实是比较复杂的,其实利用新的SQL Server语法会更加方便和简洁,从本节开始 ...
- java中的移位运算符:<<,>>,>>>总结
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- 我的MYSQL学习心得(五) 运算符
我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- .NET 基础 一步步 一幕幕[运算符、占位符、转义符]
运算符.占位符.转义符 好吧,在五局全胜之后,终于升到了三个钻,距离一个星星还有一大段距离,忽然想起来今天的博客还没写,果断坑队友,来写博客了....感觉以后还是每天更新一篇比较好.要不晚上就该熬 ...
- ECMASCript2015 提案 stage-3的对象展开运算符
看源码时看到如下的代码 export default { //通过mapActions将actions映射到methods里 methods: { ...mapActions([ 'updateSta ...
- JavaScript权威设计--JavaScript表达式与运算符,语句(简要学习笔记六)
1.delete是一元操作符,用来删除对象属性或者元素. var a={ x:1, y:2 } delete a.x; //删除x属性 “x”in a //false:a对象中已经不存在x属性 ale ...
- JavaScript权威设计--JavaScript表达式与运算符(简要学习笔记五)
1.3种原始表达式 1.直接量: 1.23 //数字直接量 “hello” //字符串直接量 ...
- LINQ to SQL语句(18)之运算符转换
运算符转换 1.AsEnumerable:将类型转换为泛型 IEnumerable 使用 AsEnumerable<TSource> 可返回类型化为泛型 IEnumerable 的参数.在 ...
- El表达式的关系运算符
El表达式的关系运算符: == 对应 eq != 对应 ne > 对应 gt < 对应 It
随机推荐
- iOS学习,需要懂的一些基础
1. KVC 与 KVO 全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制. 全称 ...
- THP Transparent HugePages 相关知识与关闭
近期遇到个LINUX系统内存比較大.未开 HugePages,业务有变化导致ORACLE连接数剧增至上千个,PageTables达到上百G.导致内存不足系统HANG住的案例. 因此须要开启 HugeP ...
- 【java读书笔记】——java开篇宏观把控 + HelloWorld
学完java有一段时间了,一直没有做对应的总结,总认为有一种缺憾.从这篇博客開始,将自己平时的学习笔记进行总结归纳,分享给大家. 这篇博客主要简单的介绍一下java的基础知识,基本的目的是扫盲.原来仅 ...
- ruby on rails出现的问题ActiveModel::ForbiddenAttributesError
首先分清楚我们在搞rails时.看资料和所使用的环境的版本号是否同样.看的资料是rails3.2,电脑配置的环境是4.0,就会出现这样的安全防范措施的问题. 这类问题大多出如今new或者create两 ...
- Java基础笔记-异常
Java中的异常机制: Throwable类是 Java 语言中所有错误或异常的超类.主要包括两个子类: Error和Exception. 一般中要处理的异常是Exception. Java中最常见的 ...
- 修改SharePoint平台登录者显示名称
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { //提升权限,拿系统服务帐号来执行此段代码 ...
- BOOST_PP_INC_I(x)实现
这个比较有意思,# define BOOST_PP_INC_I(x) BOOST_PP_INC_ ## x 连接在一起以后,然后定义为x+1 实现了inc功能,不过最多也就到255 # /* Copy ...
- MAC上使用maven打android的包,报错:No Android SDK path could be found. 解决办法
对android工程运行mvn compile出现如下信息: No Android SDK path could be found. You may configure it in the pom u ...
- js previousSibling兼容使用方法
使用previousSibling的时候发现当前元素跟上一个元素之间有空格就不获取不到对象, 查资料才知道除了ie外js的previousSibling获取的对象包括空格! 兼容方法如下: funct ...
- s3c6410学习笔记-将内核zImage、文件系统写到nandflash、屏幕校准
1.之前已经将uboot写到nandflash里面了,接下来将内核zImage.文件系统写到nandflash. 2.编译内核 cd linux-2.6.28_smdk6410 make clean ...