关于++/--优先级的问题

时间:2021-03-13 01:42:50
++在前面和后面分别是先自增和后自增,那这样++/--的运算符优先级岂不是没有用处了?
比如 b=a++ 是先把a的值赋给b之后a再自增,但是++的优先级比=高啊,这样++的运算符优先级岂不是没有用了

28 个解决方案

#1


无聊的问题,
分两步写不就得了
a++;
b=a;

#2


++在前优先级高,++在后优先级低

#3


++的优先级高,但a++的值还是a,不知道这样说明白不

#4


为什么没用了啊,它使a增加了1呀

#5


跟优先级有什么关系?
后++是赋值完了在加

#6


关于++/--优先级的问题

#7


不是那个意思 
我知道++的用法 我是说在运算符级别的表中 ++是第二个级别 是比较高的 但比如在b=a++中 是先把a的值赋给b之后a再自增 就是说遇到a++都是先把a的值传到表达式 再自增 或者++a是先自增 似乎就跟优先级别没有关系了啊 为什么还会出现在优先级的表中 

#8


.....

#9


优先级就是告诉编译器哪些先做,哪些后做~它可不关心效果怎么样
b=a++ ;
++优先级高,所以先执行a++,这种优先级高的先执行的效果已经达到,怎么能说没用呢?

#10


什么叫“运算级有用”?

你把a++当成一个函数,运行该函数有两个作用:让a自增1 ,返回a的旧值。

执行a++的时候,a++整个表达式等于a的旧值,而a已经是新值了。

#11


楼主的理解有问题。同意3楼和10楼的观点。也同意9楼的观点,但这种说法可能会误导楼主。

运算符的本质仍然是函数,做过运算符重载的朋友应该都非常清楚。
设a++对应的函数为plus1,而++a对应的函数为plus2,两函数分别定义如下(这是帮且楼理解这两个操作符,具体指针使用是否有问题请不要太计较)

int plus1(int &x) {
  int b=x;
  *x++;
  return b;
}

int plus2(int &x) {
  *x++;
  return *x;
}

b=a++; 
可以写成
b=plus1(a);
其执行结果应该等同于
b=a;
a++;


b=++a;
可以写成
b=plus2(a);
执行结果才等同于
a++;
b=a;

#12


学了一段时间了 突然想到这个问题 也许没意义 但就是不明白
b=a++;先是a把值赋给表达式,a再自增,但是如果安运算优先级的话,++比=高,这样不是应该先执行++,在执行赋值吗,可是实际不是这样

#13


yeyumin89,

“++”的优先级高于“=”,这一点没有任何疑问。

要注意的是,++操作符前置和++操作符后置是两完全独立的函数。如果误将它们当作一个函数,当然没办法理解。

这两个函数虽然都可以使传入的参数值加1;但前置++函数返回的是加1以后的值,而后置++函数返回的是加1之前的参数值。也就是说,两个函数返回的值是不同的。(参见11楼回复)

如果讲到这个份上楼主还不能理解的话,别人可能真就帮不上什么忙了。

#14


当用a做控制变量的时候就有用
比如int a=10,b;while(b=a--);

#15


引用楼主 yeyumin89 的回复:
++在前面和后面分别是先自增和后自增,那这样++/--的运算符优先级岂不是没有用处了?
比如 b=a++ 是先把a的值赋给b之后a再自增,但是++的优先级比=高啊,这样++的运算符优先级岂不是没有用了
楼主还没弄明白优先级和返回值的问题。
a++ 是先返回 a 的值,然后 a 自增。

#16


b=a++;
这里可以认为编译器做优化了

如果楼主实在想验证=和++优先级的话
就重载这两个操作符,因为重载之后符号的优先级保持不变

#17


首先要明白一点,那就是++表达式是一份拷贝,而不是变量的值。

其次,操作符在操作数的前面时,首先增加操作数的值,然后拷贝该值作为表达式的值,
      操作符在操作数的后面时,首先拷贝该值作为表达式的值,然后在增加操作数的值。

举例说明


int a,b,c,d;
a = b = 10;
c = ++a;        //首先根据运算符优先级,先进行++a(先对a加1,a等于11,然后拷贝a的值作为表达式的值),在执行赋值,因为赋值操作是将表示式的值赋给变量,也就是把拷贝的值赋给变量,此时c 等于11。
d = b++;        //同上,先进行b++(先拷贝b的值作为表达式的值,表达式为10,然后b加1,b等于11),在执行赋值操作,将表达式的值赋给变量d,d 等于10。

//下面用法错误:
++a = 10;      //因为此时=左边为a值的拷贝,不是变量,你无法向一个值赋值。


这样够明了了吧,嘿么嘿么^_^

#18


关于++/--优先级的问题楼主要记得结贴啊

#19


LZ可以这样理解,
b = a++;
++的优先级比=高,所以先执行++,那么a++返回值是a,所以接下来把a的值赋值给b;
但是++有个副作用,就是执行之后将a的值增1,所以当这语句整体执行完了后,a变成了a + 1的。

#20


搞不清楚优先级就多加括号呗
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)

#21


成天整些无聊的问题来困惑自己

#22


这个用得着讨论嘛

#23


其实很简单,你的理解错了。b=a++,是先把a的值增加1,再把a以前的值赋给b,而不是像你说的先把a的值赋给b。
---------------------------------------------------------------------------------------
++在前面和后面分别是先自增和后自增,那这样++/--的运算符优先级岂不是没有用处了?
比如 b=a++ 是先把a的值赋给b之后a再自增,但是++的优先级比=高啊,这样++的运算符优先级岂不是没有用了

#24


蛋疼·······

#25


个人觉得:
b=a++;
优先级还是++比=高
因为a++在b=a++这个等式中充当了一个表达式的作用
a++先运算,但是(a++)这个表达式本身=a(old),同时这个时候a=a(old)+1
b=a++,并不是b=a
楼主纠结的也许还是:b=a++和b=a结果一样,为什么还要向前面那样?
很简单,b=a++得目的是将原来的a赋值给b,同时希望a赋值后自加1;b=a这样的目的只是将a赋值给b

#26


懂了 这下。。。

#27


引用 7 楼 yeyumin89 的回复:
不是那个意思 
我知道++的用法 我是说在运算符级别的表中 ++是第二个级别 是比较高的 但比如在b=a++中 是先把a的值赋给b之后a再自增 就是说遇到a++都是先把a的值传到表达式 再自增 或者++a是先自增 似乎就跟优先级别没有关系了啊 为什么还会出现在优先级的表中

你的说法是错误的
b=a++不是算把a的值赋给b,而是先算a++,返回值为a原来的值
再把返回值赋给b
LZ没有开明白自增运算
前自增与后自增不光是使变量的值+1,既然它们是运算符,那么a++与++a就是运算表达式
必然是要有个结果的,前自增与后自增的区别就是这个结果

#28


现在懂了  谢谢 

#1


无聊的问题,
分两步写不就得了
a++;
b=a;

#2


++在前优先级高,++在后优先级低

#3


++的优先级高,但a++的值还是a,不知道这样说明白不

#4


为什么没用了啊,它使a增加了1呀

#5


跟优先级有什么关系?
后++是赋值完了在加

#6


关于++/--优先级的问题

#7


不是那个意思 
我知道++的用法 我是说在运算符级别的表中 ++是第二个级别 是比较高的 但比如在b=a++中 是先把a的值赋给b之后a再自增 就是说遇到a++都是先把a的值传到表达式 再自增 或者++a是先自增 似乎就跟优先级别没有关系了啊 为什么还会出现在优先级的表中 

#8


.....

#9


优先级就是告诉编译器哪些先做,哪些后做~它可不关心效果怎么样
b=a++ ;
++优先级高,所以先执行a++,这种优先级高的先执行的效果已经达到,怎么能说没用呢?

#10


什么叫“运算级有用”?

你把a++当成一个函数,运行该函数有两个作用:让a自增1 ,返回a的旧值。

执行a++的时候,a++整个表达式等于a的旧值,而a已经是新值了。

#11


楼主的理解有问题。同意3楼和10楼的观点。也同意9楼的观点,但这种说法可能会误导楼主。

运算符的本质仍然是函数,做过运算符重载的朋友应该都非常清楚。
设a++对应的函数为plus1,而++a对应的函数为plus2,两函数分别定义如下(这是帮且楼理解这两个操作符,具体指针使用是否有问题请不要太计较)

int plus1(int &x) {
  int b=x;
  *x++;
  return b;
}

int plus2(int &x) {
  *x++;
  return *x;
}

b=a++; 
可以写成
b=plus1(a);
其执行结果应该等同于
b=a;
a++;


b=++a;
可以写成
b=plus2(a);
执行结果才等同于
a++;
b=a;

#12


学了一段时间了 突然想到这个问题 也许没意义 但就是不明白
b=a++;先是a把值赋给表达式,a再自增,但是如果安运算优先级的话,++比=高,这样不是应该先执行++,在执行赋值吗,可是实际不是这样

#13


yeyumin89,

“++”的优先级高于“=”,这一点没有任何疑问。

要注意的是,++操作符前置和++操作符后置是两完全独立的函数。如果误将它们当作一个函数,当然没办法理解。

这两个函数虽然都可以使传入的参数值加1;但前置++函数返回的是加1以后的值,而后置++函数返回的是加1之前的参数值。也就是说,两个函数返回的值是不同的。(参见11楼回复)

如果讲到这个份上楼主还不能理解的话,别人可能真就帮不上什么忙了。

#14


当用a做控制变量的时候就有用
比如int a=10,b;while(b=a--);

#15


引用楼主 yeyumin89 的回复:
++在前面和后面分别是先自增和后自增,那这样++/--的运算符优先级岂不是没有用处了?
比如 b=a++ 是先把a的值赋给b之后a再自增,但是++的优先级比=高啊,这样++的运算符优先级岂不是没有用了
楼主还没弄明白优先级和返回值的问题。
a++ 是先返回 a 的值,然后 a 自增。

#16


b=a++;
这里可以认为编译器做优化了

如果楼主实在想验证=和++优先级的话
就重载这两个操作符,因为重载之后符号的优先级保持不变

#17


首先要明白一点,那就是++表达式是一份拷贝,而不是变量的值。

其次,操作符在操作数的前面时,首先增加操作数的值,然后拷贝该值作为表达式的值,
      操作符在操作数的后面时,首先拷贝该值作为表达式的值,然后在增加操作数的值。

举例说明


int a,b,c,d;
a = b = 10;
c = ++a;        //首先根据运算符优先级,先进行++a(先对a加1,a等于11,然后拷贝a的值作为表达式的值),在执行赋值,因为赋值操作是将表示式的值赋给变量,也就是把拷贝的值赋给变量,此时c 等于11。
d = b++;        //同上,先进行b++(先拷贝b的值作为表达式的值,表达式为10,然后b加1,b等于11),在执行赋值操作,将表达式的值赋给变量d,d 等于10。

//下面用法错误:
++a = 10;      //因为此时=左边为a值的拷贝,不是变量,你无法向一个值赋值。


这样够明了了吧,嘿么嘿么^_^

#18


关于++/--优先级的问题楼主要记得结贴啊

#19


LZ可以这样理解,
b = a++;
++的优先级比=高,所以先执行++,那么a++返回值是a,所以接下来把a的值赋值给b;
但是++有个副作用,就是执行之后将a的值增1,所以当这语句整体执行完了后,a变成了a + 1的。

#20


搞不清楚优先级就多加括号呗
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)

#21


成天整些无聊的问题来困惑自己

#22


这个用得着讨论嘛

#23


其实很简单,你的理解错了。b=a++,是先把a的值增加1,再把a以前的值赋给b,而不是像你说的先把a的值赋给b。
---------------------------------------------------------------------------------------
++在前面和后面分别是先自增和后自增,那这样++/--的运算符优先级岂不是没有用处了?
比如 b=a++ 是先把a的值赋给b之后a再自增,但是++的优先级比=高啊,这样++的运算符优先级岂不是没有用了

#24


蛋疼·······

#25


个人觉得:
b=a++;
优先级还是++比=高
因为a++在b=a++这个等式中充当了一个表达式的作用
a++先运算,但是(a++)这个表达式本身=a(old),同时这个时候a=a(old)+1
b=a++,并不是b=a
楼主纠结的也许还是:b=a++和b=a结果一样,为什么还要向前面那样?
很简单,b=a++得目的是将原来的a赋值给b,同时希望a赋值后自加1;b=a这样的目的只是将a赋值给b

#26


懂了 这下。。。

#27


引用 7 楼 yeyumin89 的回复:
不是那个意思 
我知道++的用法 我是说在运算符级别的表中 ++是第二个级别 是比较高的 但比如在b=a++中 是先把a的值赋给b之后a再自增 就是说遇到a++都是先把a的值传到表达式 再自增 或者++a是先自增 似乎就跟优先级别没有关系了啊 为什么还会出现在优先级的表中

你的说法是错误的
b=a++不是算把a的值赋给b,而是先算a++,返回值为a原来的值
再把返回值赋给b
LZ没有开明白自增运算
前自增与后自增不光是使变量的值+1,既然它们是运算符,那么a++与++a就是运算表达式
必然是要有个结果的,前自增与后自增的区别就是这个结果

#28


现在懂了  谢谢