printf("%d , %d\n", c++, c++); 的输出,大家如何解释?

xiaobaiwen 2010-11-14 03:29:44

test.c的源码如下:
int main()
{
int c = 0;
printf("%d , %d\n", c++, c++);
return 0;
}


输出:
$ ./test
1 , 0

一开始我认为输出是0,1,结果相反,
我知道这个和函数参数的入栈出站顺序有关。但具体的解释大家可以给我讲下吗?

...全文
1844 55 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
tracyjk 2010-11-26
  • 打赏
  • 举报
回复
未定义行为,不必深入研究,跟编译器有关
dianhun 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 xia777xia 的回复:]
引用 23 楼 xia777xia 的回复:
感觉是编译器的原因,我用vc6.0出来的结果是
0 0
但如果我把两个c++其中的任何一个改成++c的话结果就变成
1 1

但可以肯定的是如果在printf("%d , %d\n", c++, c++);后再加一条语句
printf("%d\n",c);
c的结果肯定是2

不好意思这里说错了
如果是printf("%d , %……
[/Quote]
从右到左啊
赵4老师 2010-11-26
  • 打赏
  • 举报
回复
用GDB调试时,看每句C对应的汇编不就啥都明白了吗。
Xiaoloveliuforever 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 digu 的回复:]

引用 46 楼 wissup 的回复:

这个跟编译器有关,不值得深究! 要是在实际工作当中,你写出这样的代码,你会被别人骂死的!I promise!


csdn怎么这么多这种题目?这问题没必要深究的,也永远不要写这种代码。
[/Quote]
编译器在执行的时候是从右至左的,省省吧,这种题目那么有意思吗?
naturemickey 2010-11-26
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20101117/15/1f58d999-42f0-4975-9828-36010745b9bd.html
aining0809 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 luo86106 的回复:]

编译器相关,函数调用规则相关。
[/Quote]

正解。
Linux:1, 0
Windows:0, 0
alex32108 2010-11-19
  • 打赏
  • 举报
回复
运算是自右至左的
chen870201 2010-11-15
  • 打赏
  • 举报
回复
不太明白~
i不歪 2010-11-15
  • 打赏
  • 举报
回复
说错了。。。是右结合
i不歪 2010-11-15
  • 打赏
  • 举报
回复
函数运算都是左结合
goldfrog 2010-11-15
  • 打赏
  • 举报
回复
函数参数的计算顺序在C语言标准中未定义,你得到的任何结果都只能代表你所用的编译器的当前实现
在实际工程中不要使用为好
digu 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 wissup 的回复:]

这个跟编译器有关,不值得深究! 要是在实际工作当中,你写出这样的代码,你会被别人骂死的!I promise!
[/Quote]

csdn怎么这么多这种题目?这问题没必要深究的,也永远不要写这种代码。
wissup 2010-11-15
  • 打赏
  • 举报
回复
这个跟编译器有关,不值得深究! 要是在实际工作当中,你写出这样的代码,你会被别人骂死的!I promise!
张无印 2010-11-15
  • 打赏
  • 举报
回复
c++,c++为printf的函数参数,函数参数的是从右向左传入的。参数在自制的时候做了运算,所以结果是1,0。
  • 打赏
  • 举报
回复
结果正确 从右向左计算。
jokey514 2010-11-15
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int c = 0;
printf("%d , %d\n", c++, c++);//输出0,0;关键在于逗号是同步运算,只有潜在改变,本质在变但表面没有变
printf("%d", c);//输出2;本质显示
c=0;
cout<<c++<<"\t"<<c++<<endl;//输出1,0; <<相当于分号运算符,本质和表面都变,但有延时
cout<<c;//输出2;
int a=3;
int b=4;
int d=3;
int e=4;
printf("%d,%d,%d",d+e,d++,e);//输出7,3,4;符合从左向右的逗号运算规则
cout<<endl<<a+b<<endl<<a++<<endl<<b;//输出8,3,4;运算从右向左计算
system("pause");

return 0;
}
Will的大食堂 2010-11-15
  • 打赏
  • 举报
回复
从右向左运算!
  • 打赏
  • 举报
回复
00401341 push ebp
00401342 mov ebp,esp
00401344 and esp,0xfffffff0
00401347 sub esp,0x20
0040134A call 0x4017a0 <__main>
0040134F mov DWORD PTR [esp+0x1c],0x0
00401357 mov edx,DWORD PTR [esp+0x1c]
0040135B inc DWORD PTR [esp+0x1c]
0040135F mov eax,DWORD PTR [esp+0x1c]
00401363 inc DWORD PTR [esp+0x1c]
00401367 mov DWORD PTR [esp+0x8],edx
0040136B mov DWORD PTR [esp+0x4],eax
0040136F mov DWORD PTR [esp],0x408024
00401376 call 0x401318 <printf>
0040137B mov eax,0x0
00401380 leave
00401381 ret
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 csuxiaowu 的回复:]

Assembly code

00401341 push ebp
00401342 mov ebp,esp
00401344 and esp,0xfffffff0
00401347 sub esp,0x20
0040134A call 0x4017a0 <__main>
0040134F mov DWORD PTR [esp+……
[/Quote]
yulin52 2010-11-15
  • 打赏
  • 举报
回复
1, 0
是从最右边的参数开始入栈
加载更多回复(32)

70,018

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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