这里是CC++语言的运算符列表。所有列出的运算符皆含纳于C++;第三个栏目里的内容也使用C来描述。应当注意的是C不支持运算符重载

下列运算符在两个语言中都是顺序点(运算符未重载时): &&||?: 和 ,(逗号运算符)。

C++也包含类型转换运算符const_caststatic_castdynamic_castreinterpret_cast,不在表中列出以维持简洁。类型转换运算符需要在表达式中明确使用括号,因此并不存在优先级的问题。

在C里有的运算符,除了逗号运算符和箭头记头的运算符以外,在JavaPerlC#PHP同样也有相同的优先级、结合性和语义。

运算符优先级

以下是C++编程语言中的所有运算符的优先级结合性列表。

优先级 运算符 叙述 示例 重载性 结合性
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++) …   由左至右

列表

在本表中,abc代表有效值(来自变量或返回值的逐字常数或数值)、对象名称,或适当的左值。

算术运算符[编辑]

运算符名称 语法 可重载 C里有
一元正号 +a
加法(总和) + b
前缀递增 ++a
后缀递增 a++
以加法赋值 += b
一元负号(取反) -a
减法(差) - b
前缀递减 --a
后缀递减 a--
以减法赋值 -= b
乘法(乘积) * b
以乘法赋值 *= b
除法(分之) / b
以除法赋值 /= b
模数(余数) % b
以模数赋值 %= b

比较运算符[编辑]

运算符名称 语法 可重载 C里有
小于 < b
小于或等于 <= b
大于 > b
大于或等于 >= b
不等于 != b
等于 == b
逻辑取反 !a
逻辑 AND && b
逻辑 OR || b

比特运算符[编辑]

运算符名称 语法 可重载 C里有
比特左移 << b
以比特左移赋值 <<= b
比特右移 >> b
以比特右移赋值 >>= b
比特一的补数 ~a
比特 AND & b
以比特 AND 赋值 &= b
比特 OR | b
以比特 OR 赋值 |= b
比特 XOR ^ b
以比特 XOR 赋值 ^= b

其它运算符[编辑]

运算符名称 语法 可重载 C里有
基本赋值 = b
函数调用 a()
数组下标 a[b]
间接(向下参考) *a
的地址(参考) &a
成员指针 a->b
成员 a.b
间接成员指针 a->*b
间接成员 a.*b
转换 (type) a
逗号 , b
三元条件 ? b : c
作用域解析 a::b
的大小 sizeof a
类型识别 typeid type
分配存储区 new type
解除分配存储区 delete a

语言扩展[编辑]

运算符名称 语法 可重载 C里有 提供者
标签值 && label GCC
取得型态 typeof a
typeof(expr)
GCC
最小/最大值 <? b
>? 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++运算符 (转)的更多相关文章

  1. shell运算符

    原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用. expr 是一款表达式计算工具,使用它能完成表达式的求值操作. #!/bin/bash v ...

  2. SQL Server-聚焦APPLY运算符(二十七)

    前言 其实有些新的特性在SQL Server早就已经出现过,但是若非系统的去学习数据库你会发现在实际项目中别人的SQL其实是比较复杂的,其实利用新的SQL Server语法会更加方便和简洁,从本节开始 ...

  3. java中的移位运算符:<<,>>,>>>总结

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  4. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  5. .NET 基础 一步步 一幕幕[运算符、占位符、转义符]

      运算符.占位符.转义符 好吧,在五局全胜之后,终于升到了三个钻,距离一个星星还有一大段距离,忽然想起来今天的博客还没写,果断坑队友,来写博客了....感觉以后还是每天更新一篇比较好.要不晚上就该熬 ...

  6. ECMASCript2015 提案 stage-3的对象展开运算符

    看源码时看到如下的代码 export default { //通过mapActions将actions映射到methods里 methods: { ...mapActions([ 'updateSta ...

  7. JavaScript权威设计--JavaScript表达式与运算符,语句(简要学习笔记六)

    1.delete是一元操作符,用来删除对象属性或者元素. var a={ x:1, y:2 } delete a.x; //删除x属性 “x”in a //false:a对象中已经不存在x属性 ale ...

  8. JavaScript权威设计--JavaScript表达式与运算符(简要学习笔记五)

    1.3种原始表达式     1.直接量:    1.23    //数字直接量                         “hello”    //字符串直接量                 ...

  9. LINQ to SQL语句(18)之运算符转换

    运算符转换 1.AsEnumerable:将类型转换为泛型 IEnumerable 使用 AsEnumerable<TSource> 可返回类型化为泛型 IEnumerable 的参数.在 ...

  10. El表达式的关系运算符

    El表达式的关系运算符: ==  对应  eq !=   对应  ne >    对应  gt <    对应  It

随机推荐

  1. SQL Server:SQL Like 通配符特殊用法:Escape 【转】

    SQL中escape的主要用途 1.使用   ESCAPE   关键字定义转义符.在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符.例如,要搜索在任意位置包含字符串   5%   的字符串 ...

  2. hadoop 各种组件配置参数

    ********************************************hive*********************************************** hive ...

  3. 我本人一直以来犯的错误,在看了《Think In Java》后才抓了出来(转)

    也许你是只老鸟,也许你的程序编的很精,但是,在你的程序生活,你也许没有注意到一些“常识性”的问题,因为有些时候我们不需要去注意,我们的程序 照样能够运行得飞快,但是如果那天有一个无聊的人问你一个像这样 ...

  4. 学习python 一些错误记录

    1. TypeError: 'unicode' object is not callable当遇到这样的错误时候, 一般是属性当做方法调用了,比如,selenium 脚本, driver.title ...

  5. 学习zepto.js(原型方法)

    学习zepto.js(原型方法)[1] 转载 新的一周,新的开始,今天来学习一下zepto里边的原型方法,就是通过$.进行调用的方法,也是可以通过$.fn进行扩展的方法: $.camelCase(): ...

  6. (转)设置 UILabel 和 UITextField 的 Padding 或 Insets (理解UIEdgeInsets)

    转自http://unmi.cc/uilable-uitextfield-padding-insets 主要是理解下UIEdgeInsets在IOS UI里的意义.靠,这货其实就是间隔,起个名字这么让 ...

  7. 深入学习PE文件(转)

    PE文件是Win32的原生文件格式.每一个Win32可执行文件都遵循PE文件格式.对PE文件格式的了解可以加深你对Win32系统的深入理解. 一. 基本结构. 上图便是PE文件的基本结构.(注意:DO ...

  8. SQL Server 表压缩

    表压缩有三个选项 1.page 2.row 3.none ----------------------------------------------------------------------- ...

  9. SQL Server 一些重要视图3

    1. sys.dm_tran_locks; 为每一把锁返回一行.request_session_id 可以与sys.dm_tran_session_transactions \sys.dm_exec_ ...

  10. 26个jQuery使用小技巧(25)

     下面列出了一些Jquery使用技巧.比如有禁止右键点击.隐藏搜索文本框文字.在新窗口中打开链接.检测浏览器.预加载图片.页面样式切换.所有列等高.动态控制页面字体大小.获得鼠标指针的X值Y值.验证元 ...