神奇的for,他干了什么

G-ben 2014-03-18 09:00:08
void test() {
printf("pppp");
int soNow=clock();
//printf(" \n inset");
//for(;clock()-soNow<CLOCKS_PER_SEC;)
//}
for(int i=0;i<999999099;i++) {

}
printf("\nno");
}
在 java中 pppp一定会在 for之前 流的顺序就是如此
但是在c 中 for像是 对当前行 做了手脚
那么 printf("pppp \n");可以在for之前输出打印
结果就是上面的程序 pppp打印在 for之后
请问 哥哥们 这是 怎么回事?
...全文
379 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
G-ben 2014-03-20
  • 打赏
  • 举报
回复
程序结束所有io操作都要刷新输出。。恩 谢谢哥哥们的支持 结贴
lijunbiao2080 2014-03-20
  • 打赏
  • 举报
回复
引用 13 楼 u012564309 的回复:
[quote=引用 7 楼 Adol1111 的回复:] [quote=引用 6 楼 u012564309 的回复:] [quote=引用 1 楼 Automation_dmu 的回复:] printf默认是行缓冲的, 跟for没关系, 你改成printf("pppp\n") 再试试。
引用 4 楼 truelance 的回复:
c中打印输出到内存中的缓冲区, 直到碰到回车或者eof才会真正输出到IO接口. 你的打印没加回车就会有这个现象. 话说当年我学编程第一次碰到这个问题时,也折腾了半个小时.
这是再说 如果没有 printf("pppp \n");没有 \n 就不会打印吗
引用 2 楼 vipda 的回复:
我运行了一下,是先打印的pppp啊
先打印的是 pppp但是在 for之后 for带来的延迟之后
引用 3 楼 starytx 的回复:
你的for里什么也没有,你怎么说pppp打印在了for之后?
for作为延迟使用 延迟 1s pppp的打印应该在1s之前 但实际不是 for要表达的意思类似挂起线程1s 只是从控制台的表面层次 \n 应该是表示换行吧 如果不换行 应该也可以打印 只是for就像是 \r 之后覆盖当前行 循环完毕之后 在从新打印 环境是 gcc -std=c99 我这里实际运行 期望的是 先打印 pppp 过 1s(for带来的延迟) 在打印 no 但实际是 过了1s后 pppp no一起打印 \n可以解决这个情况 但实际pppp一定会打印吧只是 太快了 即便没有\n应该也可以打印吧 那么都可以打印 为什么多了一个 延迟大概 4 5秒的for结果 结果就会不同 printf("pppp \n"); printf("pppp"); 结果是不同的 但 如果去掉for什么也不会看起出来 没有\n 表示 pppp在 for带来的延迟之后 打印 有\n 在for之前 (因为解析为 for会 使用\r 覆盖打印而后从新打印被覆盖的那一行 如果不是举一个反例子) [/quote] 先理解下C/C++里流和缓冲的概念 printf默认是行缓冲,没有遇到换行符所以内容没有被冲出来。 http://www.cnblogs.com/wonderKK/archive/2012/06/13/2547740.html[/quote]
引用 9 楼 ypzhong 的回复:
摘自UNIX环境高级编程,看第一张图最后一句话。
那么当 printf("pppp");在for延迟之后 才打印是因为 第一次\n在for之后的printf(" \nno"); 因为打印是行缓冲的 直到遇到一个\n才实际打印 那么\n 后的no 为什么会打印 是填满了行缓冲吗 还是编译期会试图在最终的打印后添加一个\n? [/quote] 那是因为程序结束,所有I/O操作都要刷新,输出。
G-ben 2014-03-20
  • 打赏
  • 举报
回复
引用 7 楼 Adol1111 的回复:
[quote=引用 6 楼 u012564309 的回复:] [quote=引用 1 楼 Automation_dmu 的回复:] printf默认是行缓冲的, 跟for没关系, 你改成printf("pppp\n") 再试试。
引用 4 楼 truelance 的回复:
c中打印输出到内存中的缓冲区, 直到碰到回车或者eof才会真正输出到IO接口. 你的打印没加回车就会有这个现象. 话说当年我学编程第一次碰到这个问题时,也折腾了半个小时.
这是再说 如果没有 printf("pppp \n");没有 \n 就不会打印吗
引用 2 楼 vipda 的回复:
我运行了一下,是先打印的pppp啊
先打印的是 pppp但是在 for之后 for带来的延迟之后
引用 3 楼 starytx 的回复:
你的for里什么也没有,你怎么说pppp打印在了for之后?
for作为延迟使用 延迟 1s pppp的打印应该在1s之前 但实际不是 for要表达的意思类似挂起线程1s 只是从控制台的表面层次 \n 应该是表示换行吧 如果不换行 应该也可以打印 只是for就像是 \r 之后覆盖当前行 循环完毕之后 在从新打印 环境是 gcc -std=c99 我这里实际运行 期望的是 先打印 pppp 过 1s(for带来的延迟) 在打印 no 但实际是 过了1s后 pppp no一起打印 \n可以解决这个情况 但实际pppp一定会打印吧只是 太快了 即便没有\n应该也可以打印吧 那么都可以打印 为什么多了一个 延迟大概 4 5秒的for结果 结果就会不同 printf("pppp \n"); printf("pppp"); 结果是不同的 但 如果去掉for什么也不会看起出来 没有\n 表示 pppp在 for带来的延迟之后 打印 有\n 在for之前 (因为解析为 for会 使用\r 覆盖打印而后从新打印被覆盖的那一行 如果不是举一个反例子) [/quote] 先理解下C/C++里流和缓冲的概念 printf默认是行缓冲,没有遇到换行符所以内容没有被冲出来。 http://www.cnblogs.com/wonderKK/archive/2012/06/13/2547740.html[/quote]
引用 9 楼 ypzhong 的回复:
摘自UNIX环境高级编程,看第一张图最后一句话。
那么当 printf("pppp");在for延迟之后 才打印是因为 第一次\n在for之后的printf(" \nno"); 因为打印是行缓冲的 直到遇到一个\n才实际打印 那么\n 后的no 为什么会打印 是填满了行缓冲吗 还是编译期会试图在最终的打印后添加一个\n?
Adol1111 2014-03-18
  • 打赏
  • 举报
回复
引用 6 楼 u012564309 的回复:
[quote=引用 1 楼 Automation_dmu 的回复:] printf默认是行缓冲的, 跟for没关系, 你改成printf("pppp\n") 再试试。
引用 4 楼 truelance 的回复:
c中打印输出到内存中的缓冲区, 直到碰到回车或者eof才会真正输出到IO接口. 你的打印没加回车就会有这个现象. 话说当年我学编程第一次碰到这个问题时,也折腾了半个小时.
这是再说 如果没有 printf("pppp \n");没有 \n 就不会打印吗
引用 2 楼 vipda 的回复:
我运行了一下,是先打印的pppp啊
先打印的是 pppp但是在 for之后 for带来的延迟之后
引用 3 楼 starytx 的回复:
你的for里什么也没有,你怎么说pppp打印在了for之后?
for作为延迟使用 延迟 1s pppp的打印应该在1s之前 但实际不是 for要表达的意思类似挂起线程1s 只是从控制台的表面层次 \n 应该是表示换行吧 如果不换行 应该也可以打印 只是for就像是 \r 之后覆盖当前行 循环完毕之后 在从新打印 环境是 gcc -std=c99 我这里实际运行 期望的是 先打印 pppp 过 1s(for带来的延迟) 在打印 no 但实际是 过了1s后 pppp no一起打印 \n可以解决这个情况 但实际pppp一定会打印吧只是 太快了 即便没有\n应该也可以打印吧 那么都可以打印 为什么多了一个 延迟大概 4 5秒的for结果 结果就会不同 printf("pppp \n"); printf("pppp"); 结果是不同的 但 如果去掉for什么也不会看起出来 没有\n 表示 pppp在 for带来的延迟之后 打印 有\n 在for之前 (因为解析为 for会 使用\r 覆盖打印而后从新打印被覆盖的那一行 如果不是举一个反例子) [/quote] 先理解下C/C++里流和缓冲的概念 printf默认是行缓冲,没有遇到换行符所以内容没有被冲出来。 http://www.cnblogs.com/wonderKK/archive/2012/06/13/2547740.html
G-ben 2014-03-18
  • 打赏
  • 举报
回复
引用 1 楼 Automation_dmu 的回复:
printf默认是行缓冲的, 跟for没关系, 你改成printf("pppp\n") 再试试。
引用 4 楼 truelance 的回复:
c中打印输出到内存中的缓冲区, 直到碰到回车或者eof才会真正输出到IO接口. 你的打印没加回车就会有这个现象. 话说当年我学编程第一次碰到这个问题时,也折腾了半个小时.
这是再说 如果没有 printf("pppp \n");没有 \n 就不会打印吗
引用 2 楼 vipda 的回复:
我运行了一下,是先打印的pppp啊
先打印的是 pppp但是在 for之后 for带来的延迟之后
引用 3 楼 starytx 的回复:
你的for里什么也没有,你怎么说pppp打印在了for之后?
for作为延迟使用 延迟 1s pppp的打印应该在1s之前 但实际不是 for要表达的意思类似挂起线程1s 只是从控制台的表面层次 \n 应该是表示换行吧 如果不换行 应该也可以打印 只是for就像是 \r 之后覆盖当前行 循环完毕之后 在从新打印 环境是 gcc -std=c99 我这里实际运行 期望的是 先打印 pppp 过 1s(for带来的延迟) 在打印 no 但实际是 过了1s后 pppp no一起打印 \n可以解决这个情况 但实际pppp一定会打印吧只是 太快了 即便没有\n应该也可以打印吧 那么都可以打印 为什么多了一个 延迟大概 4 5秒的for结果 结果就会不同 printf("pppp \n"); printf("pppp"); 结果是不同的 但 如果去掉for什么也不会看起出来 没有\n 表示 pppp在 for带来的延迟之后 打印 有\n 在for之前 (因为解析为 for会 使用\r 覆盖打印而后从新打印被覆盖的那一行 如果不是举一个反例子)
赵4老师 2014-03-18
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout);
熊熊大叔 2014-03-18
  • 打赏
  • 举报
回复
c中打印输出到内存中的缓冲区, 直到碰到回车或者eof才会真正输出到IO接口. 你的打印没加回车就会有这个现象. 话说当年我学编程第一次碰到这个问题时,也折腾了半个小时.
starytx 2014-03-18
  • 打赏
  • 举报
回复
你的for里什么也没有,你怎么说pppp打印在了for之后?
赤色彗星 2014-03-18
  • 打赏
  • 举报
回复
我运行了一下,是先打印的pppp啊
AndyStevens 2014-03-18
  • 打赏
  • 举报
回复
printf默认是行缓冲的, 跟for没关系, 你改成printf("pppp\n") 再试试。
AndyStevens 2014-03-18
  • 打赏
  • 举报
回复
引用 10 楼 mujiok2003 的回复:
[quote=引用 1 楼 Automation_dmu 的回复:] printf默认是行缓冲的, 跟for没关系, 你改成printf("pppp\n") 再试试。
The default streams stdin and stdout are fully buffered by default if they are known to not refer to an interactive device.Otherwise, they may either be line buffered or unbuffered by default, depending on the system and library implementation. The same is true for stderr, which is always either line buffered or unbuffered by default. [/quote]++
nadleeh 2014-03-18
  • 打赏
  • 举报
回复
引用 楼主 u012564309 的回复:
void test() { printf("pppp"); int soNow=clock(); //printf(" \n inset"); //for(;clock()-soNow<CLOCKS_PER_SEC;) //} for(int i=0;i<999999099;i++) { } printf("\nno"); } 在 java中 pppp一定会在 for之前 流的顺序就是如此 但是在c 中 for像是 对当前行 做了手脚 那么 printf("pppp \n");可以在for之前输出打印 结果就是上面的程序 pppp打印在 for之后 请问 哥哥们 这是 怎么回事?
把你的int i换成 volatile int i 我估计那段循环变成 add reg,0x?
mujiok2003 2014-03-18
  • 打赏
  • 举报
回复
引用 1 楼 Automation_dmu 的回复:
printf默认是行缓冲的, 跟for没关系, 你改成printf("pppp\n") 再试试。
The default streams stdin and stdout are fully buffered by default if they are known to not refer to an interactive device.Otherwise, they may either be line buffered or unbuffered by default, depending on the system and library implementation. The same is true for stderr, which is always either line buffered or unbuffered by default.
ypzhong 2014-03-18
  • 打赏
  • 举报
回复


摘自UNIX环境高级编程,看第一张图最后一句话。
百曉生 2014-03-18
  • 打赏
  • 举报
回复
引用 3 楼 starytx 的回复:
你的for里什么也没有,你怎么说pppp打印在了for之后?

+1;

lz看看这样,是pppp先输出啊

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧