鱼C论坛

 找回密码
 立即注册
查看: 3872|回复: 10

老师为什么改变printf里的某个++i会有不同的结果呢而且这个计算结果我算的和机子算的

[复制链接]
发表于 2011-6-28 00:16:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
void main()
{
int i =8;
printf("%d\n,%d\n,%d\n,%d\n,%d\n,%d\n",++i,--i,i++,i,i,-i--);
}而且这个计算结果我算的和机子算的不同啊
机子算的事8 ,7, 8, 8, 8,-8
我算的事9,8,8,9,9,-9
琢磨不透啊 希望老师和明白的同学讲解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-28 03:38:50 | 显示全部楼层
我的运行结果和你不一样,我的是:
8       8      7      8      8      -8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-28 05:28:17 | 显示全部楼层
本帖最后由 excessstone 于 2011-6-28 05:32 编辑

我又试了一下另外的情况:
    a=1;
    printf("%d \n", a);
    printf("%d %d %d %d \n", ++a, ++a, ++a, a--);


我打印出:
3 3 3 1


具体原因我觉得只能查每个编译器对 printf() 处理原则的手册了,因为 printf 的实现似乎没有统一标准,我所知道的就是从右向左取值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-28 09:22:45 | 显示全部楼层
  1. #include <stdio.h>


  2. void main()
  3. {
  4.         int i = 3 ;

  5.         printf("%d , %d \n" , ++i , ++i);
  6. }
复制代码
结果如下:
QQ截图未命名.jpg

最多的说法是说:编译器只能自加两次(也就是说只能计算并储存两次的自加结果),也就是说前两次的自加计算后才计算后面跟的。
这个理论可以解释这样的情况:
  1. #include <stdio.h>


  2. void main()
  3. {
  4.         int i = 3 , j;

  5.         j = (++i) + (++i);
  6.         printf("%d\n" , j);
  7. }
复制代码
QQ截图未命名.jpg

共同谈论下,呵呵。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-28 09:48:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-30 16:46:20 | 显示全部楼层
#include <stdio.h>

int main()
{
    int i, k;
    i = 3;

    k = (++i) + (++i) + (++i) + (++i) + (++i);
       
    printf("%d\n",k);

        return 0;
}
看看这个例子,我的答案是 31,看来只能连续两次自加是对的。
两次自加后 i=5,这时进行加法,和是 10,因为已经连续自加了两次,所以只能在自加一次,也就是 i=6,此时作加法,和为 16,再自加一次, i=7,再加法 和为 23,再自加 i=8, 最后做加法,和为 31.
但是值得注意的是只有两个自加的例子 (++i) + (++i) = 10,说明程序给 ++i 分配了一个临时变量,所以结果是 10。
同理,--i,或者 i++, i-- 都可能有一个临时变量名,再加上只能连续两次运算的问题,使得这种表达式成了一个智力游戏。在加上printf()从右向左先算一遍的问题,我选择放弃。
最后一个例子
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,j, k;
    i = 3;
    j=10;

    k = (++i) + (++i) + (++i) + (++i) + (++i);
    printf("%d\n\n",k);

    printf("   j = %d\n ++j = %d\n   j = %d\n --j = %d\n --j = %d\n --j = %d\n j-- = %d\n ++j = %d\n j++ = %d\n", j, ++j, j, --j,--j, --j, j--, ++j, j++);

    return 0;
}
打印结果
   j = 9
++j = 9
   j = 9
--j = 9
--j = 9
--j = 9
j-- = 12
++j = 9
j++ = 10
似乎可以说,同样的运算符的值是一样的。不过到此为止吧,头疼。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-1 12:01:59 | 显示全部楼层

o
谢谢 似乎明白些了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-1 12:15:06 | 显示全部楼层
这个程序在不同机子上执行结果不一样。我的观点是不必纠结于这个问题。对于程序员来说,这仅仅是个反面教材,告诉我们不要写出这样执行结果不定的程序。

以下是对该语句的一些说明:
printf("%d\n,%d\n,%d\n,%d\n,%d\n,%d\n",++i,--i,i++,i,i,-i--);

      虽然C语言标准规定函数参数是从右到左进栈的,但标准没有规定参数的计算顺序(参数进栈顺序和参数的计算顺序是两个不同的概念),也就是说printf函数的参数++i,--i,i++,i,i,-i--的计算顺序可以乱七八糟,不同编译器用不同的顺序算都是符合标准的(只要标准没说的东西,随便做也要认为是复合标准的)。所以这题的答案就是五花八门的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-1 14:20:51 | 显示全部楼层
是不是不同编译器自己定下的规则啊,我得出的是8 7 7 7 7 -8  的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-1 14:22:10 | 显示全部楼层
仰望天上的光 发表于 2011-7-1 12:15
这个程序在不同机子上执行结果不一样。我的观点是不必纠结于这个问题。对于程序员来说,这仅仅是个反面教材 ...

绝对同意~我宁愿逐个逐个用printf输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-1 17:00:00 | 显示全部楼层
有个编程原则:在一条语句中,绝对不要对同一个变量使用多次的++,--之类有副作用(改变变量值)的操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-28 03:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表