C语言 ++a a++

WildeZzz 2020-03-02 05:56:39
为什么同样的条件写在printf里会出现不同的结果呢。 表达式a- -的值不就是a.吗 表达式- -a的值也该是a-1之后的值啊
...全文
641 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
直接上汇编,a++多了一个保存数据的临时变量,而++a没有这个变量,所以能使用++a不要使用a++
yangxf啦啦啦 2020-03-07
  • 打赏
  • 举报
回复
看一下编译过程中产生的汇编代码,就明白它的计算顺序了
笔下无墨 2020-03-07
  • 打赏
  • 举报
回复
引用 4 楼 lin5161678的回复:
[quote=引用 1 楼 與蘤舊縐 的回复:] printf是从后向前计算的,也就是a--先来,然后再--a
错的 这是未定义行为 没规定要从后向前算[/quote] 得看编译器,
Nonoas 2020-03-07
  • 打赏
  • 举报
回复
这种问题本身没什么实际意义,只是用于激发探索精神而已
  • 打赏
  • 举报
回复
求值顺序和参数入栈顺序是两回事
C++的boost 2020-03-07
  • 打赏
  • 举报
回复
引用 28 楼 C++的boost 的回复:
printf原型有__cdecl,所以从右往左算
呵呵

没错
C++的boost 2020-03-07
  • 打赏
  • 举报
回复
逗号运算符是从左到右的,可是printf原型是
int __cdecl printf(const char * __restrict__ _Format,...);
__cdecl意味着参数从右到左压入栈中,从右往左。
所以,
printf("%d%d",--a,a--);
=
printf("%d%d",--a,12); //a==11
=
printf("%d%d",10,12);
输出
10 12



C++的boost 2020-03-07
  • 打赏
  • 举报
回复
printf原型有__cdecl,所以从右往左算 呵呵😊
qq_29058893 2020-03-07
  • 打赏
  • 举报
回复
逗号运算符是从右边开始算了
WildeZzz 2020-03-07
  • 打赏
  • 举报
回复
引用 25 楼 (´▽`)ノProgram(´▽`)ノ的回复:
这个容易出现致命错误,找本书好好记住
嗯,上次做题的时候选错了
Vegdie 2020-03-07
  • 打赏
  • 举报
回复
这个容易出现致命错误,找本书好好记住
coo135 2020-03-06
  • 打赏
  • 举报
回复
这个行为是是未定义的,C++的求值顺序规则写的很明白了。

来自cppreference的截图:

Michael阿明 2020-03-06
  • 打赏
  • 举报
回复
++或--,在前面,先+-后再使用,否则,先使用,再操作
  • 打赏
  • 举报
回复
我一直理解的是a++是先用再加1,++a是先加1再用
windyNight99 2020-03-06
  • 打赏
  • 举报
回复
a--就是先用再减,--a就是先减再用,变量在前就是先用,--在前就是先减
玉生香 2020-03-03
  • 打赏
  • 举报
回复
这说明函数参数,从右往左的, 先执行a-- 输出12 a本身 11 在执行--a 输出10 a本身10
ggglivw 2020-03-03
  • 打赏
  • 举报
回复
最好不要写这种代码,根本没必要人为增加代码难度.
一星伴月 2020-03-02
  • 打赏
  • 举报
回复
你可以试一下,这个不同编译器的话,结果会是不同的,不要写在输出里,肯定与预期答案没错的,个人觉得没必要纠结这个东西
「已注销」 2020-03-02
  • 打赏
  • 举报
回复
引用 11 楼 lin5161678 的回复:
[quote=引用 10 楼 與蘤舊縐 的回复:] 不过从右向左计算还是正确的
你怎么看出 从右到左是正确的?? [/quote] 行吧,在你那个编译器上试了下printf("%d %d",a,a++),结果是0,0 这样看起来可以彻底推翻了,应该是由压栈顺序决定的了,从哪向哪不能确定,网上查执行顺序基本全是从右向左,刚查了下从左向右,发现了相关叙述,学到了,3q
lin5161678 2020-03-02
  • 打赏
  • 举报
回复
引用 10 楼 與蘤舊縐 的回复:
[quote=引用 8 楼 lin5161678 的回复:] [quote=引用 6 楼 與蘤舊縐 的回复:] [quote=引用 4 楼 lin5161678 的回复:] [quote=引用 1 楼 與蘤舊縐 的回复:] printf是从后向前计算的,也就是a--先来,然后再--a
错的 这是未定义行为 没规定要从后向前算[/quote] 先从右往左计算各表达式的值(入栈),再从左往右输出各表达式的值(出栈) 不去找源码了,你查查,暂时没找到反例[/quote] [/quote] 值确实有问题,看来这里还是不能屏蔽这个未定义行为,不过从右向左计算还是正确的,所以下次就不要这样写了[/quote] C在线编译器
加载更多回复(10)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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