孤星
孤星
       我现在还是一名在校的大学生,不过2006 年我会走出校园,成为社会上的一员,我现在深感到我的计算机专业知识的不足。所以想通过网上学习,来提高自身,我也希望有更多的朋友,来一起学习C++等系列课程,需心请教!
       上一次,有人遇到这样一个问题,也许现在已经解决了,但我还是要将这个问题,分析一下,!
问题是这样的:

#include "iostream.h"
 int main( )
{   int i = 3 ;
    int sum = (i++) + (i++) + (i++);
    cout << sum;

    }
  在VC 6、0  结果是 16,我认为是这样的, 在VC里 先将 前两个i ++  相加,两次 i++ 为5+5=10 ,再和第三个 i 相加,结果就是十六了,不知有何高见!
posted on 2005-12-25 19:44 孤星 阅读(576) 评论(15)  编辑 收藏 引用
Comments
  • # re: 初来乍到
    梁宇翔
    Posted @ 2005-12-25 20:27
    这样写代码会被骂的,int sum = (i++) + (i++) + (i++);
    sum的结果有可能是随机的。
    如果不是无聊到了极点的话,
    还是不要这样写吧。
    这是我的建议:
    int x = i++;
    int sum = x*3;  回复  更多评论   
  • # re: 初来乍到
    zhy
    Posted @ 2005-12-25 21:52
    不知道你怎么得到的16
    不过事实上是9
    你在cout《i时i为6;
    同意楼上的说法。  回复  更多评论   
  • # re: 初来乍到
    Ying-Shen
    Posted @ 2005-12-25 22:09
    int sum = (i++) + (i++) + (i++);

    这个中国大学计算机系老师自认为是C语言中重要的知识点的地方,
    在C++的标准里面就一句the result is compiler specific就结束了。

    就是这个小地方浪费了每个中国大学计算机系学生的时间,并且对计算机编程
    认识造成重大误导。并且这个错误还在一届届的延续下去。。。。。中国计算机教育界的悲哀。。。

      回复  更多评论   
  • # re: 初来乍到
    huangyi
    Posted @ 2005-12-25 23:26
    如果你的目的是研究vc编译器的话...
    如果你上面16的说法正确的话(没试过) 那vc的这种方法似乎有点不人道啊 呵呵  回复  更多评论   
  • # re: 初来乍到
    hehehe
    Posted @ 2005-12-25 23:44
    the result is compiler specific这句话我喜欢。。。  回复  更多评论   
  • # re: 初来乍到

    Posted @ 2005-12-26 10:28
    这个中国大学计算机系老师自认为是C语言中重要的知识点的地方,
    在C++的标准里面就一句the result is compiler specific就结束了。

    就是这个小地方浪费了每个中国大学计算机系学生的时间,并且对计算机编程
    认识造成重大误导。并且这个错误还在一届届的延续下去。。。。。中国计算机教育界的悲哀。。。

    严重同意这个!  回复  更多评论   
  • # re: 初来乍到
    50米
    Posted @ 2005-12-26 15:04
    呵呵顺序点的情况估计不少人都没有听过吧,^_^托大了呵呵:)

    下面举例说明吧呵呵。
    int m=1;
    int n;
    n=m++ + m++;
    请回答结果是多少?

    正确回答是:不知道!语言没有规定它应该算出什么,结果完全依赖具体系统在具体上下文中的具体处理。其中牵涉到运算对象的求值顺序和变量修改的实现时刻问题

    a = 4; cout << a++ << a;

    这种东西根本不该写,讨论其效果没有意义。

    我们知道它是
    (cout.operator <<(a++)).operator << (a);
    的简写。先看外层函数调用,这里需要算出所用函数(由加下划线的一段得到),还需要计算a 的值。语言没有规定哪个先算。如果真的先算函数,这一计算中出现了另一次函数调用,在被调函数体执行前有一个顺序点,那时a++ 的副作用就会实现。如果是先算参数,求出a 的值4,而后计算函数时的副作用当然不会改变它(这种情况下输出两个4 )。当然,这些只是假设,实际应该说的是:这种东西根本不该写,讨论其效果没有意义。


    程序语言通常都规定了执行中变量修改的最晚实现时刻(称为顺序点、序点或执行点)。程序执行中存在一系列顺序点(时刻),语言保证一旦执行到达一个顺序点,在此之前发生的所有修改(副作用)都必须实现(必须反应到随后对同一存储位置的访问中),在此之后的所有修改都还没有发生。在顺序点之间则没有任何保证。对C/C++ 语言这类允许表达式有副作用的语言,顺序点的概念特别重要。  回复  更多评论   
  • # re: 初来乍到
    味全每日C++
    Posted @ 2005-12-27 16:55
    不要太苛求语法..
    追求这样的细节不利于自己的提高:)  回复  更多评论   
  • # re: 初来乍到
    LOGOS
    Posted @ 2005-12-27 17:11
    关于这个问题,我也差异了一下,不过编译成汇编后,就明白了:这些事情,是编译器决定的事情.
    ; Line 11
    mov DWORD PTR _i$[ebp], 3
    ; Line 12
    mov eax, DWORD PTR _i$[ebp]
    add eax, DWORD PTR _i$[ebp]
    add eax, DWORD PTR _i$[ebp]
    mov DWORD PTR _sum$[ebp], eax
    mov ecx, DWORD PTR _i$[ebp]
    add ecx, 1
    mov DWORD PTR _i$[ebp], ecx
    mov edx, DWORD PTR _i$[ebp]
    add edx, 1
    mov DWORD PTR _i$[ebp], edx
    mov eax, DWORD PTR _i$[ebp]
    add eax, 1
    mov DWORD PTR _i$[ebp], eax  回复  更多评论   
  • # re: 初来乍到
    发咯簌簌
    Posted @ 2005-12-27 19:23
    VC6.0中运算结果是9。  回复  更多评论   
  • # re: 初来乍到
    rotcet
    Posted @ 2005-12-31 19:28
    c本身没有对表达式的求值运算方式做规定,所以这是编译器相关的,这种问题在真实开发中属于不良代码,不可以这样写  回复  更多评论   
  • # re: 初来乍到
    勾来斌
    Posted @ 2006-02-05 11:14
    基本同意梁宇翔和Ying-Shen
    这样写程序有谁知道其语义到底是什么
      回复  更多评论   
  • # re: 初来乍到
    yskin
    Posted @ 2006-02-22 11:48
    我前几天也看到过,他说的是:
    int sum = (++i) + (++i) + (++i);

    有人说按照c++标准应该是18.但是vc6编译出来是16.还有人说vc7.1出来是18.

    楼主既然记得16,一定是你把程序给记错了。  回复  更多评论   
  • # re: 初来乍到
    unknown
    Posted @ 2006-04-19 17:39
    浪费时间  回复  更多评论   
  • # re: 初来乍到
    JJJ
    Posted @ 2007-09-07 15:06
    浪费时间  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理