自增自减和赋值操作的优先级

zucchiniy 2015-02-25 09:44:01
我有一个问题想不太明白,就是关于++,=,--的优先级的,
下面这个程序,我不理解第二个POP操作的时候 ,声明的是item = item[--top]
我理解应该是--的操作优先级更高,也就是先自减1,然后把这个值赋给item,但是按我的理解,这样输出的就不是这个栈的栈顶了,可是程序运行后确实是输出的栈顶,有没有人能帮忙解释一下,难道--a的操作优先级小于赋值吗?
按优先级看的话,应该是先[],++/--,=但是为什么,将push,修改为items[++top] = item;之后,程序会判断出错?(数组的最大限的判断会出错)
程序是

bool stack::push(const Item &item)
{
if(top < MAX)
{
items[top++] = item;
return true;
}
else
return false;
}
bool stack::pop(Item &item)
{
if(top > 0)
{
item = items[--top];
return true;
}
else
return false;
}
...全文
458 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiht594 2015-02-25
  • 打赏
  • 举报
回复
push123之后 top是3, 3个值是item[0] item[1] item[2] 从0开始的 不是1
zucchiniy 2015-02-25
  • 打赏
  • 举报
回复
引用 1 楼 jiht594 的回复:
第一次push是item[0] = x,然后top自加后top=1 所以pop是前置--, 先top自减变成0, 后得到item[0]
这样的话,pop我就不太理解了,如果是先自减的话,item = items[--top]的操作我赋值的时候,item返回值就不是栈顶的值了 类似我先PUSH 1,2,3,三个数,然后我pop的时候 ,先自减,item不就是2了吗,为什么我return的时候 ,还是return的3?
jiht594 2015-02-25
  • 打赏
  • 举报
回复
第一次push是item[0] = x,然后top自加后top=1 所以pop是前置--, 先top自减变成0, 后得到item[0]
第六章 运算符与表达式 C运算符的分类: 算术运算符:+、-、*、/、%、++、-- 关系运算符;>、<、==、!=、>=、<= 逻辑运算符:&&、||、! 位操作运算符:位与&、位或|、位非~、位异或^、左移<<、右移>> 赋值运算符:=、复合算术运算赋值(+=、-=、*=、/=、%=)、复合位运算赋值(&=、|=、^=、<<=、>>=) 条件运算符:?: 逗号运算符:, 指针运算符:取地址&、取内容* 求字节数运算符:sizeof 其他运算符:()、下标[]、成员运算符(->、.) 6.1 概述 按运算符连接操作数分三类: 1.单目运算符:又称一元运算符,即只有一个操作数的运算符。负号-、正号+、自增++、自减--、非!、sizeof、指针运算符、部分位操作运算符。 2.双目运算符:又称二元运算符,连接两个操作数。大部分运算符属于此类。 3.三目运算符:连接三个操作数。C语言中唯一的三目运算符为条件运算符(?:)。 运算符有优先级和结合性。运算先后顺序受运算符的优先级和结合性制约。 表达式由常量、变量、函数和运算符组成。单个常量、变量、函数调用形式可看作表达式的特例,称为初等表达式。运算符左边的操作数称为左操作数,右边的叫右操作数。 6.2 算术运算 1.整数运算 加减乘除运算、单目运算符负号-将整数符号取反。求余运算符%计算整数相除所得的余数,如11%4为11/4的余数3。 a.整数运算结果为整数。整数相除返回整数部分,舍去小数部分,编译器不同舍入方法不同。11/4结果是2,1/3结果为0,1/5*5结果不为1。 b.除法运算中除数不能为0,求模运算操作数必须为整型,因此不能进行除零和模零运算。 c.运算符的执行顺序由优先级决定,单目运算符负号-优先级高于加减乘除,乘除优先级高于加减。 可以用括号运算符标明或改变计算顺序,括号中的表达式总是先执行。四则运算符为左结合。 2.实数运算:实数运算的结果为实型。 3.字符运算

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧