鱼C论坛

 找回密码
 立即注册
查看: 4751|回复: 8

关于输出printf的问题

[复制链接]
发表于 2013-2-14 22:49:11 | 显示全部楼层 |阅读模式
2鱼币
void main()
{
int i=8;
int j=8;
printf("%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,-i++,-i--);
//  打印出来的结果              8  , 7  ,8  ,-8  ,-8
//  不明白的地方,请指教!     i=? ,i=? ,i=?,i=? ,i=?
printf("\n");
//               打印结果    j的值   
printf("%d\n",++j);//9       j=9
printf("%d\n",--j);//8       j=8
printf("%d\n",j++);//8       j=9
printf("%d\n",-j++);//-9     j=10
printf("%d\n",-j--);//-10    j=9      这是按我的理解写的,如果不对,请大神指出,O(∩_∩)O谢谢!!!  

}

最佳答案

查看完整内容

printf("%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,-i++,-i--); 此输出是编译器相关的。虽然C语言中函数的参数入栈一定是从右到左的,但是请注意,这里有两种“顺序”:一个是参数入栈的顺序,一个是计算参数的顺序。C语言完全没有规定函数的参数计算顺序(当然肯定要在该参数入栈前计算出该参数的值),因此,不同C编译器可以以不同的参数计算顺序计算这些参数的值,然后再从右到左让它们入栈,这样就得到不同的结果。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-14 22:49:12 | 显示全部楼层
printf("%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,-i++,-i--);
此输出是编译器相关的。虽然C语言中函数的参数入栈一定是从右到左的,但是请注意,这里有两种“顺序”:一个是参数入栈的顺序,一个是计算参数的顺序。C语言完全没有规定函数的参数计算顺序(当然肯定要在该参数入栈前计算出该参数的值),因此,不同C编译器可以以不同的参数计算顺序计算这些参数的值,然后再从右到左让它们入栈,这样就得到不同的结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-15 12:00:13 | 显示全部楼层
  1. #include <stdio.h>

  2. void main()
  3. {
  4. int i=8;
  5. int j=8;
  6. printf("%d\n%d\n%d\n%d\n%d\n",++i,--i, i++,-i++);
  7. printf("\n%d\n", i);
  8. }
复制代码
这个是甲鱼哥的视频里面的吧                   printf("%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,-i++,-i--);的时候VC的编译器是从右向左算的(这个视频里貌似说了)     所以从右向左算的话就是  8  , 7  ,8  ,-8  ,-8       如果还不算太明白的话 再在 printf("%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,-i++,-i--);后加一个printf("%d\n", i);    自己去掉上边的++i或添加之类的  应该能弄懂了吧               我也是初学者 如果说错了请大神勿喷
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-15 13:38:39 | 显示全部楼层
正在学习中。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-15 17:31:59 | 显示全部楼层
printf是从右到左。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-15 23:37:44 | 显示全部楼层
本帖最后由 浅_孤影 于 2013-2-15 23:39 编辑

[code]void main()
{
        int i=8;
        int j=8;
        printf("%d %d\n%d %d\n%d %d\n%d %d\n%d %d\n",++i,i,--i,i,i++,i,-i++,i,++i,i);
        
        printf("%d\n",i);
        printf("\n");
        printf("%d %d\n%d %d\n",++j,j,j--,j);
        printf("%d\n",j);

        
}
9 8      第五步   打印i=8,执行++i,打印9
8 9      第四步   打印9,执行--i,得i=8
9 9      第三步   第二步传递的值为i=9,打印9,然后执行i++,打印9,i的值实际应该变为11,但是第四部  
                        打印的i=9
-9 9    第二步   打印i=9,然后运算(-i++),打印结果是-9,但此处i的值应变为10,但是第三步
                        中打印出i的值仍为9
9 8      第一步  先打印i=8 ,然后运算++i,i=9
11
根据以上分析,我觉得是当自加或自减符号在前时printf打印时计算,在后时不计算,但最终得到的结果是正确的结果。不知道是不是我的思路有问题,请大神指教
9 8
8 8
8
Press any key to continue
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-16 10:23:05 | 显示全部楼层
浅_孤影 发表于 2013-2-15 23:37
[code]void main()
{
        int i=8;

这我不太明白该咋说 应该就是你理解的那样吧  求别的大神表达清楚吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-16 10:52:57 | 显示全部楼层
不过上面说的仅仅是理论上结果不同,目前主流的C编译器实现都是从右向左,计算一个参数的值然后马上让它入栈。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-16 12:58:32 | 显示全部楼层
仰望天上的光 发表于 2013-2-16 10:51
printf("%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,-i++,-i--);
此输出是编译器相关的。虽然C语言中函数的参数入 ...

我还是不太明白,可能这个参数计算顺序跟编译器有关系吧,不过还是谢谢你
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-8 07:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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