c语言的求值顺序问题。

luuillu 2011-06-29 08:21:24
请问下面的代码输出是什么,为什么会出现这样的结果?
我自己测了一下,发现与我原想的结果不一样。


#include<stdio.h>


int f()
{
putchar('f');
return 0;
}
int g()
{
putchar('g');
return 1;
}
int h()
{
putchar('h');
return 2;
}

struct Test
{
struct Test* (*fun)(struct Test*, int );

};
struct Test* fun(struct Test* pt, int v)
{
printf("%d",v);
return pt;
}

int main()
{

struct Test t[10];
t[0].fun=fun;

t[f()].fun(&t[0],g())->fun(&t[0],h());
putchar('\n');

}

...全文
168 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-06-30
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

不要写连自己也预测不了结果的代码!
luciferisnotsatan 2011-06-30
  • 打赏
  • 举报
回复
http://blog.csdn.net/luciferisnotsatan/archive/2011/05/31/6456696.aspx
南京浪人甲 2011-06-30
  • 打赏
  • 举报
回复
Windows下用dev C++ 结果:hgf12
Linux 用gcc 结果:fg1h2

AnYidan 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhao4zhong1 的回复:]

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

不要写连自己也预测不了结果的代码!
[/Quote]

不要写连自己也预测不了结果的代码!
flysnowhite 2011-06-29
  • 打赏
  • 举报
回复
我在VC6.0下运行,结果:hgf12.
我只知道在VC下参数的传递顺序是右结合的,也就是按照从右向左的顺序计算的。但这题好像并不涉及参数传递顺序,而与.->运算符的计算顺序有关。至于结果为何如此,还请高手回答。
机智的呆呆 2011-06-29
  • 打赏
  • 举报
回复
因为这个表达式中含有多个子表达式,这些子表达式的求值顺序c++木有规定,所以结果跟编译器相关。
t[f()].fun(&t[0],g())->fun(&t[0],h());
例如红色部分的表达式求值和h()表达式,求值顺序不同就导致结果不同的。

69,371

社区成员

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

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