鱼C论坛

 找回密码
 立即注册
查看: 6687|回复: 19

请教大家一个问题。关于printf的。

[复制链接]
发表于 2013-3-19 15:19:49 | 显示全部楼层 |阅读模式

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

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

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--);
}
这个程序中printf函数里语句多个输出时到底是怎么执行的,不明白结果为什么竟然是:8 7 8 8 -8 -8(为节省空间没有换行。)

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-19 15:41:09 | 显示全部楼层
未定义行为
结果是不确定的
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-19 15:42:14 | 显示全部楼层
你在哪里看到这段代码的
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-3-19 15:59:38 | 显示全部楼层
就是在我们这个工作室的C语言讲解的“顺序程序设计01-零基础学习C语言07”这里有这个代码段。下面是网址:http://blog.fishc.com/category/c/page/6,请帮忙看一下到底是为什么这样的结果?
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-3-19 16:01:52 | 显示全部楼层

就是在我们这个工作室的C语言讲解的“顺序程序设计01-零基础学习C语言07”这里有这个代码段。下面是网址:http://blog.fishc.com/category/c/page/6,请帮忙看一下到底是为什么这样的结果?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-19 16:06:14 | 显示全部楼层
printf函数从右到左执行,从左到右输出!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-19 17:37:39 | 显示全部楼层
从右向左运算的。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-20 10:05:10 | 显示全部楼层
子瓜 发表于 2013-3-19 16:01
就是在我们这个工作室的C语言讲解的“顺序程序设计01-零基础学习C语言07”这里有这个代码段。下面是网址: ...

代码是错误的 结果不可靠 没价值
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-20 10:06:52 | 显示全部楼层
huise865 发表于 2013-3-19 16:06
printf函数从右到左执行,从左到右输出!

代码是错误的
c标准没有要求参数求值按照什么顺序
你这里假设他是从右向左 这个做法是不可取的
结果不确定的
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-20 10:11:04 | 显示全部楼层
名人堂_丿_帅 发表于 2013-3-19 17:37
从右向左运算的。

就算真的是从右向左求值 你怎么确定第二个 i 求值的时候 第一个表达式的副作用已经完成

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-20 12:24:52 | 显示全部楼层
本帖最后由 huise865 于 2013-3-20 12:34 编辑
我是师兄 发表于 2013-3-20 10:11
就算真的是从右向左求值 你怎么确定第二个 i 求值的时候 第一个表达式的副作用已经完成

你可能没有理解++运算符;
++i,--i,i++,i--,-i++,-i--

首先执行-i-- ,此时取i的值为8,输出 -8 ;
执行 -i++ , 此时i的值为8 ,输出 -8 ;
执行 i-- , 此时i的值为8 ,输出 8 ;
执行i++,此时i的值为8 ,输出8;
执行--i ,先运算再输出 ,i此时的值为8 ,8-1=7,输出 7;
执行++i,先运算再输出,i此时的值为7 ,7+1=8,输出 8;

所以结果是 :8 7 8 8 -8 -8

i--和i++运算所得的结果在下一语句才会生效,因为他们是先输出在运算的;
--i和++i是先运算在输出,所以结果即可生效;

如果你不相信,那你可以这样试试:
int i = 8;
printf("%d %d %d %d %d %d %d %d",i--,i--,i--,i--,i--,i--,i--,i--);
printf("%d %d %d %d %d %d %d %d",i++,i++,i++,i++,i++,i++,i++,i++);
printf("%d %d %d %d %d %d %d %d",++i,++i,++i,++i,++i,++i,++i,++i);
printf("%d %d %d %d %d %d %d %d",--i,--i,--i,--i,--i,--i,--i,--i);

然后看看结果就知道为什么了!

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-20 13:51:39 | 显示全部楼层
[quote]huise865 发表于 2013-3-20 12:24 8 8 7 8 -7 -8
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-20 14:05:19 | 显示全部楼层
[quote]huise865 发表于 2013-3-20 12:24 http://codepad.org/HslJ5s3A  ←←单击进入
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-20 14:06:46 | 显示全部楼层
huise865 发表于 2013-3-20 12:24
你可能没有理解++运算符;
++i,--i,i++,i--,-i++,-i--

你怎么解释这个结果
8
8
7
8
-7
-8
→→http://codepad.org/HslJ5s3A←←
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-20 14:13:20 | 显示全部楼层
我是师兄 发表于 2013-3-20 14:06
你怎么解释这个结果
8
8

贴上源代码!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-20 14:18:44 | 显示全部楼层
huise865 发表于 2013-3-20 14:13
贴上源代码!

http://codepad.org/HslJ5s3A
就在这个链接里面
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-20 14:22:21 | 显示全部楼层
本帖最后由 我是师兄 于 2013-3-20 14:24 编辑
huise865 发表于 2013-3-20 14:13
贴上源代码!

_10.JPG
奇葩的结果还有这个 单击图片看得更清晰

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-22 18:32:33 | 显示全部楼层
我是师兄 发表于 2013-3-20 10:11
就算真的是从右向左求值 你怎么确定第二个 i 求值的时候 第一个表达式的副作用已经完成

我想应该与编译器有关系。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-22 18:55:45 | 显示全部楼层
我估计 要么 没理解自增自减 (大多数)要么就是编译器的方法有不同比如从左向右和从右向左当初我都快为此抓狂了死活想不通为什么会输出这个结果 O(∩_∩)O~ 不知道对你是否有帮助
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-22 19:48:11 | 显示全部楼层
研究这个没意思~没个编译器的结果可能不一样!有的从左到右执行,有的从右到左执行
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-5 12:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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