Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1366401
  • 博文数量: 118
  • 博客积分: 3888
  • 博客等级: 中校
  • 技术积分: 2940
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-10 18:15
个人简介

一看二做三总结

文章分类

全部博文(118)

分类: C/C++

2011-05-29 23:16:36

下面程序的执行结果是什么?
int main()
{
 int i = 10;
 i = (i++) + 8;
 printf ("i=%d", i);
 return 0;
}
结果是19。
为什么呢?这与i++的性质有关。当前的表达式中使用的是i的值,执行完当前表达式后,会把i加1。所以"i = (i++) + 8;"可表达为下面的形式:
i = i + 8;
i++;
所以i的值为18。
 
再看看下面的程序:
int main()
{
 static int i = 10;
 i = (i++) + 8;
 printf ("i=%d", i);
 return 0;
}
结果是什么?好像应该也是19。
有可能,但不一定。在vc上测试结果是19,在gcc上的测试结果是11。
奇怪吧,呵呵.
 
我的理解是gcc有问题,static只是说明变量的特性,但数据操作方式应该是一致的。
不过这不是关键,关键是要说明编程时不要使用复杂的语法,各种编译器对常用语法的解释是一样的,但对于某些不常用的语法,解释并不一定一致。
 
阅读(2620) | 评论(4) | 转发(0) |
0

上一篇:linux中的面向对象编程

下一篇:Objdump入门

给主人留下些什么吧!~~

GFree_Wind2011-05-31 10:04:03

fireaxe: 第一次听说序列点,回头google上去学习学习,呵呵。
发现这个问题时也想到不同的编译器实现可能不同,但对于同样是在gcc编译器上,对static变量与局部变量的处理.....
这是使用static的汇编输出:

(gdb) disassemble main
Dump of assembler code for function main:
0x080483c4 <main+0>:    push   %ebp
0x080483c5 <main+1>:    mov    %esp,%ebp
0x080483c7 <main+3>:    and    $0xfffffff0,%esp
0x08048

fireaxe2011-05-31 00:00:49

GFree_Wind: i = (i++) + 8;这个语句,实际上有序列点的问题。标准中并没有严格规定。所以各个平台的实现就会有不同。谁写这样的代码,就让他自己去维护。.....
第一次听说序列点,回头google上去学习学习,呵呵。
发现这个问题时也想到不同的编译器实现可能不同,但对于同样是在gcc编译器上,对static变量与局部变量的处理方式不同就有些不理解了

Zimbu2011-05-30 21:55:12

A sequence point is a point in the program's execution sequence at which all previous side effects of execution are to have taken place and at which no subsequent side effects will have occurred.

GFree_Wind2011-05-30 12:10:45

i = (i++) + 8;这个语句,实际上有序列点的问题。标准中并没有严格规定。所以各个平台的实现就会有不同。谁写这样的代码,就让他自己去维护。