当前位置: 代码迷 >> C语言 >> 求助,关于自增的问题 也许你没见过
  详细解决方案

求助,关于自增的问题 也许你没见过

热度:239   发布时间:2008-04-30 21:58:03.0
回复 19# 的帖子
谢谢 一个老手对一个新手的批评指教。不过对于一个刚学到函数的新手有点难度去理解。再次感谢这位老师,又让我找到了一个学习的途径。
----------------解决方案--------------------------------------------------------
四楼的,第一个i用完后就++了
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]StarWing83[/un] 在 2008-4-29 23:24 的发言:[/bo]

况且,TC出现的时候,还没有标准。不遵 ...

1.Turbo C 2.01 发布时间是89年5月11日,ANSI C最早版本是1983年制定的,1987年,ANSI又公布了87 ANSI C。而后又发布了 C89,C99 以后肯定还会有新的标准,Turbo C 2.01遵循的是C89
2.C标准可以看作是C语言使用者和C编译器实现者之间的协议,一种规范。C编译器实现者在不违反协议的原则下可以自由地按自己的方式来实现这个规范,这就是造成LZ问题的原因。
例如:A实现者  i=( ++i ) + (i*5)这个算式是从左往右算
而 B实现者  i=( ++i ) + (i*5)这个算式是从右往左算 这个对C标来说都是充许的,但两者的结果就不同。
3。没有一个C编译器实现者不对C标进行扩充,而且没有一个C编译器实现者是100%按C标准实现的
----------------解决方案--------------------------------------------------------
另外,个人认为C主要方向是底层系统软件,精简、高效率才是C标应该追求的东西,所以相对来说,我更喜欢C89而不是C99,C99有点累赘了,很多东西都是累赘,C99中值得说道的就是可以在for中直接申明变量,for(int i.....),还有一个就是"//"方便了许多
----------------解决方案--------------------------------------------------------
警告: ‘i’上的运算结果可能是未定义的
#include "stdio.h"
int main()
{
        int i=4, y;
        y=(i++) + (i++);
        printf("%d", y);
        return  0;
}

8在我这是这个结果。由于自增运算符必须是左值,个人认为只有这个结果的搭配。
    movl    $4, -8(%ebp)         #就是i
    movl    -8(%ebp), %eax
    addl    -8(%ebp), %eax       #结果为8=%eax
    movl    %eax, -12(%ebp)      # i=4  %eax和-12(%ebp)都是8
    addl    $1, -8(%ebp)         #i++  结果在-8(%ebp)
    addl    $1, -8(%ebp)         #i++
    movl    -12(%ebp), %eax      # -12(%ebp)=8=%eax
    movl    %eax, 4(%esp)        #参数2  y
    movl    $.LC0, (%esp)        #参数1  "%d"
    call    printf
不同编译器可能不同吧
但我的编译器是这样实现的 :
    addl    $1, -8(%ebp)         #i++  结果在-8(%ebp)
    addl    $1, -8(%ebp)         #i++
不知道你们的是什么样,初学,可能说的不对,给批评教育

[[it] 本帖最后由 c_acceleration 于 2008-5-1 11:12 编辑 [/it]]
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]Knocker[/un] 在 2008-5-1 10:15 的发言:[/bo]

另外,个人认为C主要方向是底层系统软件,精简、高效率才是C标应该追求的东西,所以相对来说,我更喜欢C89而不是C99,C99有点累赘了,很多东西都是累赘,C99中值得说道的就是可以在for中直接申明变量,for(int i.....),还有一个就是" ...



for(int i.....),我最恨它了,一般程序都习惯在程序开始初始化,它突然半路出来,会不会影响我的效率啊和布局啊。
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]c_acceleration[/un] 在 2008-5-1 11:25 的发言:[/bo]
for(int i.....),我最恨它了,一般程序都习惯在程序开始初始化,它突然半路出来,会不会影响我的效率啊和布局啊。

看来你还不清楚尽可能地压榨一个变量的作用域的意义
一个变量或者对象,作用域越小越好,全局的东西越少越好
当然,未必绝对

[color=white]
----------------解决方案--------------------------------------------------------
同意ls,在需要的地方才创建变量,在不需要的地方释放是我最想达到的
估计ls的ls没有见过有人写的代码,函数开始定义了一堆变量,
可是每个分支只用其中的一部分,时间和空间效率都低
----------------解决方案--------------------------------------------------------
谭浩强的那本书里面 明确说了,关于这类问题,有的TC执行顺序是不一样的。
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]moonwalker[/un] 在 2008-5-1 11:56 的发言:[/bo]

同意ls,在需要的地方才创建变量,在不需要的地方释放是我最想达到的
估计ls的ls没有见过有人写的代码,函数开始定义了一堆变量,
可是每个分支只用其中的一部分,时间和空间效率都低 ...


批评教育啊
你们随便说,我看我的
提高C++性能的编程技术
也许我看的这本书很垃圾。。。

[[it] 本帖最后由 c_acceleration 于 2008-5-1 12:47 编辑 [/it]]
----------------解决方案--------------------------------------------------------
  相关解决方案