C++上的一些运算符顺序的问题:我是C++初学者,对运算符顺序不是很了解,希望各位大虾帮帮忙,就快考试了,急急

供稿:hz-xin.com     日期:2025-01-16
指向运算符的理解,希望哪位大侠帮下忙啊

什么东东,你指的是->这个运算符吗?这个运算符很简单,他只是适合于使用指针来访问类或者结构中的成员变量,成员函数等成员时才使用。用处就只有这么一点,如果你是使用类的对象,或者结构的变量来访问其中的成员时,就使用.点运算符,->运算符没什么别的用处。作个例子吧,比如有结构A ma; A *p=&ma;其中A是struct结构类型的,其中有成员变量i,那么在使用ma和p访问这个成员变量i的方法就是ma.i和p->i;只有在使用指针来访问成员时才会用到->运算符,一般情况下是用不到的。

运算符 描述
. [] () 域访问、数组下标和函数调用
++ -- - ~ ! delete new typeof void 一元运算符、返回数据类型、对象创建、未定义的值
* / % 乘、除、取模
+ - + 加、减、字符串连接
> >>> 位移动
>= instanceof 小于、小于等于、大于、大于等于、instanceof
== != === !== 相等、不相等、恒等、不恒等
& 按位“与”
^ 按位“异或”
| 按位“或”
&& 逻辑“与”
|| 逻辑“或”
?: 条件
= oP= 赋值、带操作的赋值
, 多重求值
表达式 ┃优先级
————————————————————————————╂————
()(小括号) [](数组下标) .(结构成员) ->(指针型结构成员)┃ 最高
————————————————————————————┃ ↑
!(逻辑非) .(位取反) -(负号) ++(加1) --(减1) &(变量地址)┃ │
————————————————————————————┃ │
*(指针所指内容) type(函数说明) sizeof(长度计算) ┃ │
————————————————————————————┃ │
*(乘) /(除) %(取模) ┃ │
————————————————————————————┃ │
+(加) -(减) ┃ │
————————————————————————————┃ │
>(位右移) ┃ │
————————————————————————————┃ │
(大于) >=(大于等于) ┃ │
————————————————————————————┃ │
==(等于) !=(不等于) ┃ │
————————————————————————————┃ │
&(位与) ┃ │
————————————————————————————┃ │
^(位异或) ┃ │
————————————————————————————┃ │
|(位或) ┃ │
————————————————————————————┃ │
&&(逻辑与) ┃ │
————————————————————————————┃ │
||(逻辑或) ┃ │
————————————————————————————┃ │
?:(?表达式) ┃ │
————————————————————————————┃ │
= += -=(联合操作) ┃ │
————————————————————————————┃ │
,(逗号运算符) ┃ 最低

①虽然你明确要求是题目,但是那些你可以在网络搜索到大量题库(百度文库、豆丁以及P2P软件、迅雷等等资源中获取,关键字为:C++ 习题集 习题 试题 试卷 参考答案),我仍然会强调一下运算符的实践阶段的理论问题。

②运算符跟操作数有关,所以必须先搞清楚各种类型(基本类型、指针、引用、对象)和重载。

③如果已经清楚②,那么还有一些极为重要的技巧:
a.后置运算符总是比前置运算符先结合(毫无例外)
比如 *a++ 等价于 *(a++)
*a[5] 等价于 *(a[5])
(其中++和[]都属于后置运算符,而*属于前置运算符)

b.赋值运算符永远是最后优先,而倒数第二优先的是逗号运算符.
比如 a=1,b++,++c,4; 结果a=4;(但是前面的几个子表达式都先计算了,只是返回最后一个逗号表达式)

c.按位逻辑运算符比关系逻辑运算符具有更高优先级:
a>b&c 等价于a>(b&c)

d.还有一个概念要很明白:左值和右值的区别。
a=1; a是左值,1是右值 赋值运算符的左边必须是变量,而不是值。
(++a)=1; 是会报错的。

④你有两种方法完全掌握C++的运算符问题:
1.必要性逻辑:C++是一门几乎理论上完美的语言,创造它的人是理论和实践的顶级牛人,那么,所有运算符的逻辑顺序必须是往最合理的那个方向去思考:怎样才最符合严谨的语法和使用?
比如你提到的*(p+2)**(w+3), 你会发现,这种语法初看奇怪,实际上必须是左右都是【指针解引用】后再相乘。否则没有其它合理的语法结合性了。

2.记特例:虽然优先级列表有一面(书最后都会列出优先级列表),但是普遍的规则你是知道的,你只需要把其中的你认为很奇怪的优先级顺序记住,下次只要符合你习惯的,都正常做题,由于不符合你习惯的少部分规则,你已经特意记忆了,等于你就解决了所有优先级的问题。

⑤最后,你在吸收以上内容后,再次去做题+复习优先级列表,反复这样,5天每天做20道(估计最多每天10-25分钟),把不懂的地方根据优先级去分析,就能完全掌握它了

考试,建议去翻阅往年的试题,考题不会出那些个比较刁钻古怪的题的,呵呵。
。。。我看到了,就随便说说,考题我没有= =

写点代码,多试试就行了,运算符顺序没必要死记.记住常用的就行了.
int a = 1;
if(++a == 2 || ++a = 3 )
a++;
else
--a;
cout<<a<<endl;

1.运算符和其优先级

优先级 运算符 结合律











列 ( ) [ ] -> . 从左至右
! ~ ++ -- (类型) sizeof + - * & 从右至左
* / % 从左至右
+ - 从左至右
<< >> 从左至右
< <= > >= 从左至右
== != 从左至右
& 从左至右
^ 从左至右
| 从左至右
&& 从左至右
|| 从右至左
?: 从右至左
= += -= *= /= %= &= ^= |= <<= >>= 从左至右

在C++程序设计语言中说 ++的后增(减)量(lvalue++)的优先级大于*。前增(减)量(++lvalue)和*的优先级相同。

*p++的意思是*(p++),不是(*p)++。

这样区别来对待前增量和后增量:y=++x相当于y=(x+=1),而y=x++相当于y=(t,x+=1,t)这样的区别看起来相当不错。

2.什么是左值?
左值(lvalue)是可以被赋值的表达式。左值位于赋值语句的左侧,以其相对的右值(rvaule),则位于赋值语句的右侧。每条赋值语句都必须有一个左值和一个右值。左值必须是内存中一个可存储的变量,而不能是一个常量。
左值能够存储表达式的结果:++x的结果存储在x中所以它是左值。x++的结果不是放在x中的值,所以它不是左值。
右值是不可取址的,如常量,函数返回值,类型转换结果;
int& u(); 它返回的是左值,(a=4)=28; //a=4是左值表达式。
3.求值顺序
在一个表达式里,子表达式的求值顺序是没有定义的。特别的是,你不能假定表达式从左向右求值。 int x=f(3)+g(7) 没有定义 f(),g()哪个先调用。
int i=1; v[i]=i++;
结果也是没有定义的或者是v[1]=1,或者是v[2]=1。
但是有三种运算符的计算顺序是有定义的:逗号(,),逻辑与(&&),逻辑或(| |)。它们保证了左边的运算对象一定要先于右边的运算对象计算。如:b=(a=2,a++)计算后把3赋给b。&&只有在第一个运算对象为true时才算第二个。| |只有在第一个运算对象是false时才算第二个,这叫短路求值。
注意区分逗号的两种用法:
f1(v[i],i++) 两个参数;
f2( (v[i],i++) ) 逗号表达式;
对于f2来说参数只有一个相当于i++。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cxyol/archive/2006/03/16/625713.aspx

请问编程高手:关于a++与++a的问题
这是一个前加加与后加加的问题。结果是:a=5,b=15 因为a初始值等于3,a++是后加加,所以a等于3.++a,是前加加、上面那个a后加加以后是等于4,所以前加加以后a就等于5;b=a++*++a;这是运算符的优先级造成的,相当于b=(a++)*(++a),所以b=3*5;用事实来证明一切吧!using System;nam...

C语言自加运算符运行优先级问题
、"y=(++x)*(x++)"、"y=++x*(x++)"的不同在于前者表达式中++均是前置的,后者中有前置也有后置++ --两个操作符要求操作数必须是一个左值 前缀形式的++操作符出现在操作数的前面。操作数的值被增加而表达式的值就是操作数增加后的值。后缀形式的++操作符出现在操作数的后面。抽象的说,...

求大神 c语言中++运算符
m=(++k)+(++k)+(++k);l=++k+ ++k+ ++k;n=++k+++k+++k;这些写法是很危险的,不同的运算顺序可能会产生意料不到的结果,实际使用中没有人会这么写,而且具体的执行顺序是依赖编译器的,不同编译器的执行结果可能不同,这样写是不对的, 可以参考《C专家编程》对于这种问题的讨论。

关于逗号运算符和++的优先级
我觉得你的第二例子有点过于依赖编译器了,换一个编译器就可能是其他的结果了,并不一定是你解释的那样发生的。在正式编程里,千万不要在一个表达式中用一个值会发生变化的变量2次以上,如a[i++]=i;等,都可能引起问题。最后说一下,顺序点并不是一种技巧,而是辅助编译器的运算顺序制定的一个...

int i=10;j=20 i=i++ +j; j=++j+i; 试问最后i,j的值分别为多少?
这个是关系到运算符的顺序问题,++(自加)运算的优先级要高于+或- ;因此,第一个i=i+++j时,是i=i=i+1+j,因为i++是先附值在自加,这都知道,当i++展开后就会出现上面的表达式i=i=i+1+j,因此结果是31;第二个也是一样,只是i的初值为31,根据上面的讲解,相信你能解决这个!同时...

C语言中的i++、++i的优先级
++运算符优先级高于乘法运算,因此,先执行++i(和你加不加括号没有关系,即等价于i*i*++i),i变成2,再执行乘法运算2*2*2=8,结果是8,而不是2 运行验证:分析无误。如果是i++,而不是++i,则计算结果是1,同样也不是2

c++中关于++,--等运算符优先级的运算
对于浮点型变量,数据的存储形式是复杂的,加上一位后会引起数值的混乱。自增运算符的用法有下面两种,分别称之为前缀自增和后缀自增:1)+ +i;在使用i之前,先使i的值加1,相当于i=i+1;使用i值;2)i+ +;在使用i之后,使i的值加1,相当于使用i值;i=i+1;粗略的看,++i和i++...

我知道++ n < 10是先递增再比较,n ++ < 10是先比较再递增,可为什么呢...
++ 自加运算符的优先级比 < 比较运算符的优先级高, 自加运算符中 ++n 的优先级比 n++ 的优先级高 就是说 ++n<10 是n先自加1 再跟10比较,n++<10是n和10比较完了在给自己加1 是优先级的关系、

y++&&++z‖++x x=1,y=0,z=0运算结果过程,x y z的值
1. 首先,明确各个运算符的优先顺序。++a > 逻辑运算符a >a++ 逻辑运算符&&和||的优先级一致,从左到有计算 ++a是先要自增再参与其他运算 a++是参与了其他运算再自增 2. 再看题目。y++&&++z‖++x y是先参与运算再自增, z和x是先自增再参与运算 也就是:0 && 1 || 1 (从...

关于C语言++用法的一个基础问题
c[s[i]]++就是c[s[i]]加1。s[i]是小于5的数,作为c[]的一个下标。自增运算符 ++ 使操作数的值加1,其操作数必须为可变左值(可简单地理解为变量)。问题在于:++ 可以置于操作数前面,也可以放在后面,如:++i;i++ ;++i表示,i自增1后再参与其它运算;而i++ 则是i参与运算后,i...