当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 17 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : “++j + ++j + ++j"不同编译器不同结果
帖子发表于 : 2007-11-09 11:35 
头像

注册: 2006-09-02 18:58
帖子: 474
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
代码:
#include <stdio.h>
main()
{
    int a,j=100;
       a = ++j + ++j + ++j;
       printf("%d",a);
}

TC的结果是 309。GCC , g++ 和 VC++的结果是307。为什么?!
TC的结果可以理解,但307就不能理解了 。


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-11-09 11:37 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
看自己写的标题。


_________________
● 鸣学


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-11-09 11:46 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
这些代码不好..


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-11-09 11:51 
头像

注册: 2006-02-27 20:19
帖子: 599
地址: works system
送出感谢: 0 次
接收感谢: 0 次
代码是写给人看的,不是写给机器看的!
这种代码除了在学校某些脑子缺几个二极管的老师会考之外还有别的用处吗?


_________________
东西路,南北走
十字路口人咬狗
拿起狗来打砖头
砖头咬了狗一口
图片


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-11-09 11:53 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
代码:
        movl    $100, -8(%ebp)
        addl    $1, -8(%ebp)
        addl    $1, -8(%ebp)
        movl    -8(%ebp), %eax
        addl    -8(%ebp), %eax
        addl    $1, -8(%ebp)
        addl    -8(%ebp), %eax


看上去是这样的 ..
先做前两个 ++ , 然后相加, 然后再做最后一个++, 再相加
++j -> j=101
++j -> j=102
j+j -> tmp = 204
++j -> j=103
tmp +j -> 307


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-11-09 12:04 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
球猫,变态的才去理会这样的代码的。


_________________
● 鸣学


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-11-09 12:10 
头像

注册: 2005-06-11 14:03
帖子: 6226
地址: 不明真相的群众
送出感谢: 0 次
接收感谢: 0 次
不要去做这样的题目或者测试, 没有任何意义. 真正写代码的时候要写最容易理解的代码, 即便性能不是最高.


_________________
我的blog,关于技术,软件,linux,vim <---- 所有博客均被河蟹.


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-11-09 12:13 
头像

注册: 2006-05-12 23:28
帖子: 621
地址: 江西乐平
送出感谢: 0 次
接收感谢: 1
这种代码如何处理,在C语言标准里没有规定。编译器爱怎么处理就怎么处理。因而代码也不具备良好的可移植性,没有很大的实际意义。


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2007-11-09 12:24 

注册: 2007-03-17 13:16
帖子: 113
送出感谢: 0 次
接收感谢: 0 次
吃饱撑着了!!!


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2007-11-09 13:06 

注册: 2006-03-10 15:10
帖子: 3182
地址: xi'an China
送出感谢: 0 次
接收感谢: 2
没用的代码,这种东西是未定义的,不论你的编译器让它等于1, 100,1000,还是 10000 你都得接受,如果你用这样的代码的话


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2007-11-09 16:04 

注册: 2007-07-16 21:42
帖子: 214
送出感谢: 0 次
接收感谢: 0 次
BigSnake.NET 写道:
代码:
        movl    $100, -8(%ebp)
        addl    $1, -8(%ebp)
        addl    $1, -8(%ebp)
        movl    -8(%ebp), %eax
        addl    -8(%ebp), %eax
        addl    $1, -8(%ebp)
        addl    -8(%ebp), %eax


看上去是这样的 ..
先做前两个 ++ , 然后相加, 然后再做最后一个++, 再相加
++j -> j=101
++j -> j=102
j+j -> tmp = 204
++j -> j=103
tmp +j -> 307


正确!鉴定完毕!


_________________
HP Compaq 6515b(GL087PA)
Sawfish+Emacs+Firefox+Xpdf+MPlayer...


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2007-11-09 20:32 
头像

注册: 2005-10-02 8:22
帖子: 723
送出感谢: 0 次
接收感谢: 0 次
写这种代码不是给人看的。是给自己看的。自己要记得是用什么的编译器编的。然后,让其它人猜去。


_________________
子曰,三人行,必有我师,吾曰,世间万物,皆为我师.


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2007-11-11 17:12 
头像

注册: 2006-09-02 18:58
帖子: 474
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
明白......
首先,非常感谢 BigSnake.NET ,我学会了一个方法去看代码了.
这代码似乎很没用......对于你们来说.但是我就想知道个为什么.我认为,理这段代码的不会是变态,也不是吃饱撑着......谢谢回贴的前辈们......
我不会再来发这种没用的代码了,即使我不明白.


页首
 用户资料  
 
14 楼 
 文章标题 :
帖子发表于 : 2007-11-15 7:33 

注册: 2006-10-08 22:20
帖子: 232
送出感谢: 0 次
接收感谢: 0 次
参看The C Programming Language第2章最后一节

Function calls, nested assignment statements, and increment and decrement operators cause "side effects" - some variable is changed as a by-product of the evaluation of an expression. In any expression involving side effects, there can be subtle dependencies on the order in which variables taking part in the expression are updated. One unhappy situation is typified by the statement

a[i] = i++;

The question is whether the subscript is the old value of i or the new. Compilers can interpret this in different ways, and generate different answers depending on their interpretation. The standard intentionally leaves most such matters unspecified. When side effects (assignment to variables) take place within an expression is left to the discretion of the compiler, since the best order depends strongly on machine architecture. (The standard does specify that all side effects on arguments take effect before a function is called, but that would not help in the call to printf above.)

The moral is that writing code that depends on order of evaluation is a bad programming practice in any language. Naturally, it is necessary to know what things to avoid, but if you don't know how they are done on various machines, you won't be tempted to take advantage of a particular implementation.

函数调用、嵌套赋值语句、自增与自减运算符都有可能产生“副作用”——在对表达式求值的同时,修改了某些变量的值。在有副作用影响的表达式中,其执行结果同表达式中的变量被修改的顺序之间存在着微妙的依赖关系。下列语句就是一个典型的令人不愉快的情况:

a[i] = i++;

问题是:数组下标i是引用旧值还是引用新值?对这种情况编译器的解释可能不同,并因此产生不同的结果。C语言标准对大多数这类问题有意未作具体规定。表达式何时会产生这种副作用(对变量赋值),将由编译器决定,因为最佳的求值顺序同机器结构有很大关系。(ANSI C标准明确规定了所有对参数的副作用都必须在函数调用之前生效,但这对前面介绍的printf函数调用没有什么帮助。)

在任何一种编程语言中,如果代码的执行结果与求值顺序相关,则都是不好的程序设计风格。很自然,有必要了解哪些问题需要避免,但是,如果不知道这些问题在各种机器上是如何解决的,就最好不要尝试运用某种特殊的实现方式。


_________________
http://czk.8866.org/http://groups.google.com/group/linux-wz/


页首
 用户资料  
 
15 楼 
 文章标题 : Re: “++j + ++j + ++j"不同编译器不同结果
帖子发表于 : 2007-11-15 9:10 

注册: 2007-11-15 9:08
帖子: 8
送出感谢: 0 次
接收感谢: 1
tlhl28 写道:
代码:
#include <stdio.h>
main()
{
    int a,j=100;
       a = ++j + ++j + ++j;
       printf("%d",a);
}

TC的结果是 309。GCC , g++ 和 VC++的结果是307。为什么?!
TC的结果可以理解,但307就不能理解了 。


这就是上吊时需要把绳子多往脖子上缠几圈,不然勒不死!写出这样的代码有什么意思?自己给自己找麻烦!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 17 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译