| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1735 人关注过本帖
标题:++i和i++的困惑
只看楼主 加入收藏
纸鸢2022
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2022-11-7
结帖率:50%
收藏
已结贴  问题点数:18 回复次数:18 
++i和i++的困惑
i=3;
printf("%d",i++); 输出值是3,C语言程序是循环执行的吗?在下个周期是不是就输出了4?还是一直输出为3,只有在循环语句里执行完毕一个循环后加1到下一个循环运算?
i=3;
printf("%d",++i);输出值是4,也就是说先把i执行完加1运算后输出。
printf("    ")这个函数对应的头文件是#include<stdio.h>,这个头文件能自定义吗?若不能怎么去查询都有哪些头文件这些头文件分别代表啥功能?若能,大致的方法是什么?

[此贴子已经被作者于2022-11-13 17:00编辑过]

搜索更多相关主题的帖子: 循环 ++i i++ 输出 头文件 
2022-11-13 16:54
菠萝吹雪
Rank: 2
等 级:论坛游民
帖 子:12
专家分:10
注 册:2022-10-14
收藏(1)
得分:6 
2022-11-13 22:33
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:6 
我回答一下我能看懂的部分

i=3;
printf("%d",++i);输出值是4,也就是说先把i执行完加1运算后输出。
是的,因为C语言规定:在参数评估完毕、函数调用之前,有个序列点。
但如果你问 int x = ++i 是不是先把i执行完加1运算后赋值给x的话,那就不一定,因为在C语言中(C++不是这样)这两者之间没有序列点,既可能x先变为4,也可能i先变为4。

怎么去查询都有哪些头文件
https://zh.

这些头文件分别代表啥功能
你打开上面的链接,然后随便选一个 ------ 比如“<stdio.h>     输入/输出”------ 点击进入,就能看到 https://zh.
2022-11-14 09:53
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:6 
触及某些敏感点,有点痒。
R版您确定前置++和序列点之间有关么?是新版本的说法么?
印象中只有postfix ++和序列点有关系吧?

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2022-11-15 17:04
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
回复 4楼 forever74
对于序列点,无论postfix还是prefix都是一样的,C语言对此自始至终没改过。https://zh.

C++则不再使用“序列点”的说法,改为“按顺序早于”等等;后面又规定operate=的右边早于左边。其它没什么
2022-11-15 18:44
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:0 
以下是引用rjsp在2022-11-14 09:53:15的发言:

但如果你问 int x = ++i 是不是先把i执行完加1运算后赋值给x的话,那就不一定,因为在C语言中(C++不是这样)这两者之间没有序列点,既可能x先变为4,也可能i先变为4。

我是说在这个例子中,一定是i先变为4,x是后变为4的,这件事可以确定。
但无需引用序列点理论。——是这么个“无关”。

浓缩一下就是说,在可以确定先后顺序的操作里,有些先后本来就是确定的,并不是一定要等序列点来裁决。

[此贴子已经被作者于2022-11-15 20:03编辑过]


对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2022-11-15 19:58
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
我是说在这个例子中,一定是i先变为4,x是后变为4的,这件事可以确定。

i变为4、x变为4 都属于「副作用」
++i的结果是4 属于「表达式评估」
而C语言标准只规定「副作用」在顺序点之前完成,没有规定在「表达式评估」之前完成
除非你能用标准中的条款说服我

我还有另外两个不太有说服力的理由
1. 如果保证了你说的这点,那么 ++i + ++i 应当属于「实现定义行为」而不是「未定义行为」
2. C语言的每个条款都有意义,如果你说的成立,除了限制编译器作代码优化这个缺点外,我想不到任何有用的地方
2022-11-15 21:05
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

这句话的意思是说,表达式评估的结果是操作数的新值,也就是说,前置的++的副作用不是在下一个序列点之前,而是在表达式评估之前。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2022-11-15 21:48
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
++i 这个表达式的值是i自增后的新值,
一开始i=3,那么 ++i 就是4

并不代表i自增这个行为发生于表达式评估这个行为之前,i值变为4 属于 副作用,C语音只规定 副作用 发生于 下个序列点 之前就行了。
2022-11-15 22:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
拿 ++i + ++i 为例,按你所讲的话,无论是先评估前者还是后者,都应该是9(不是4+5,就是5+4)
但实际上它是未定义行为
2022-11-15 22:52
快速回复:++i和i++的困惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045007 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved