cout 和printf 求解释

时间:2021-08-31 04:48:04
//程序一
#include <iostream>
using namespace std;
int main(){
int a;
while(scanf("%lf",&a) && a){
cout<<a<<"\n";
}
}

//程序二
#include "stdio.h"
int main(){
int a;
while(scanf("%d",&a)&&a){
printf("%d\n",a);
}
return 0;
}

这两个程序的区别就在cout和printf,我执行的结果就是程序二会等到输入0的时候一次性输出所有的数字,但是程序一会在每输入一个数字,并且回车后,立即输出这个数字,按照一直说的cout有缓冲区,printf没有缓冲区的话,不应该出现这样的问题啊。搞不懂怎么回事啊,求大牛解释。

22 个解决方案

#1


谁说printf无缓冲的啊

#2


程序1 %lf 对应的是double ,而你是int a 已经错了。

#3


引用 2 楼 akirya 的回复:
程序1 %lf 对应的是double ,而你是int a 已经错了。

sorry,我贴的时候贴错了,重点是下面的cout和printf啊,
#include <iostream>
using namespace std;
int main(){
    int a;
    while(scanf("%d",&a) && a){
        cout<<a<<"\n";
    }
}

#4


引用 3 楼 KnownAll 的回复:
引用 2 楼 akirya 的回复:程序1 %lf 对应的是double ,而你是int a 已经错了。
sorry,我贴的时候贴错了,重点是下面的cout和printf啊,
C/C++ code?12345678#include <iostream>using namespace std;int main(){    int a;    while(scanf("%……

改过之后的2个程序运行效果一样 

#5


表示没有出现楼主说的问题

#6


scanf("%lf",&a)
scanf("%d",&a)
你确定是这两个程序的区别就在cout和printf

#7


引用 4 楼 akirya 的回复:
引用 3 楼 KnownAll 的回复:引用 2 楼 akirya 的回复:程序1 %lf 对应的是double ,而你是int a 已经错了。
sorry,我贴的时候贴错了,重点是下面的cout和printf啊,
C/C++ code?12345678#include <iostream>using namespace std;int main(){    int ……

我其实就想知道什么情况下是回车立即显示结果,而什么情况下是输入0以后才会显示结果。比如:
输入:
1[回车]
2[回车]
0[回车]
结果有两种:
一种是
#include "iostream"
using namespace std;
int main()
{
int a;
while(cin>>a&&a)
{
printf("%d\n",a);
}
return 0;
}

1
2
0
1
2
#include "iostream"
using namespace std;
int main()
{
int a;
while(cin>>a&&a)
{
cout<<a<<"\n";
}
return 0;
}

一种会是
1
1
2
2
0
很费解啊。

#8


不要混用C的scanf/printf和C++的cin/cout。两者各自有自己的缓冲区,虽然有同步机制,但是有时的确不会按照你想的来。一个缓冲区刷新了,另外一个不一定也同步刷新。

#9


引用 7 楼 KnownAll 的回复:
引用 4 楼 akirya 的回复:引用 3 楼 KnownAll 的回复:引用 2 楼 akirya 的回复:程序1 %lf 对应的是double ,而你是int a 已经错了。
sorry,我贴的时候贴错了,重点是下面的cout和printf啊,
C/C++ code?12345678#include <iostream>using namespace std;i……

你用的啥编译器?
我这里2个代码都行为都是一样的

#10


理解“流”的概念,scanf是从 当中 按格式提取信息,如果没有合适的信息可提取,那么流是不会动的。

#11


printf一样也有缓冲

#12


同求学习一下!

#13


2个的运行效果应该是一样的啊,LZ用的什么编译器啊,说明一下可以么

#14


printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

不要写连自己也预测不了结果的代码!

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

#15


引用 9 楼 akirya 的回复:
引用 7 楼 KnownAll 的回复:引用 4 楼 akirya 的回复:引用 3 楼 KnownAll 的回复:引用 2 楼 akirya 的回复:程序1 %lf 对应的是double ,而你是int a 已经错了。
sorry,我贴的时候贴错了,重点是下面的cout和printf啊,
C/C++ code?12345678#include <iostream>u……

安装vs的时候装的那个cl编译器。

#16


引用 13 楼 cheng7068 的回复:
2个的运行效果应该是一样的啊,LZ用的什么编译器啊,说明一下可以么

cl.exe

#17


引用 14 楼 zhao4zhong1 的回复:
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&amp;的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

不要写连自己也预测不了结果的代码!

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步……

恩恩,忠告不错。谢谢呢。

#18


引用 16 楼 KnownAll 的回复:
引用 13 楼 cheng7068 的回复:2个的运行效果应该是一样的啊,LZ用的什么编译器啊,说明一下可以么
cl.exe

vs版本 ?

#19



我发现,可能和notpad++有关系的,之前虽然有几次在vs2008下面运行出现两种结果不一样的情况,但是后面修改了“%lf”->“%d”的错误之后,在vs2008下面就没再出现这样的问题。但是我用notepad++配置了cl.exe 编译器编译运行的时候,就会出现上述的两种结果不一样的情况。虽然最后也没有解决,不过既然这样的话,估计应该是cl和notepad++结合的时候,出现的什么状况吧。

引用 18 楼 akirya 的回复:
引用 16 楼 KnownAll 的回复:引用 13 楼 cheng7068 的回复:2个的运行效果应该是一样的啊,LZ用的什么编译器啊,说明一下可以么
cl.exe
vs版本 ?

#20


引用 19 楼 KnownAll 的回复:
我发现,可能和notpad++有关系的,之前虽然有几次在vs2008下面运行出现两种结果不一样的情况,但是后面修改了“%lf”->“%d”的错误之后,在vs2008下面就没再出现这样的问题。但是我用notepad++配置了cl.exe 编译器编译运行的时候,就会出现上述的两种结果不一样的情况。虽然最后也没有解决,不过既然这样的话,估计应该是cl和notepad++结合的时候,出现的什么状况吧。
……

应该是你没编译成功吧

#21


引用 8 楼 Bokutake 的回复:
不要混用C的scanf/printf和C++的cin/cout。两者各自有自己的缓冲区,虽然有同步机制,但是有时的确不会按照你想的来。一个缓冲区刷新了,另外一个不一定也同步刷新。

学习了 谢谢

#22


引用 20 楼 akirya 的回复:
引用 19 楼 KnownAll 的回复:我发现,可能和notpad++有关系的,之前虽然有几次在vs2008下面运行出现两种结果不一样的情况,但是后面修改了“%lf”->“%d”的错误之后,在vs2008下面就没再出现这样的问题。但是我用notepad++配置了cl.exe 编译器编译运行的时候,就会出现上述的两种结果不一样的情况。虽然最后也没有解决,不过既然这样的话,……

成功了,就是运行的时候出问题,应该是在notepad++的控制台在按Enter的时候有什么不同的地方吧。

#1


谁说printf无缓冲的啊

#2


程序1 %lf 对应的是double ,而你是int a 已经错了。

#3


引用 2 楼 akirya 的回复:
程序1 %lf 对应的是double ,而你是int a 已经错了。

sorry,我贴的时候贴错了,重点是下面的cout和printf啊,
#include <iostream>
using namespace std;
int main(){
    int a;
    while(scanf("%d",&a) && a){
        cout<<a<<"\n";
    }
}

#4


引用 3 楼 KnownAll 的回复:
引用 2 楼 akirya 的回复:程序1 %lf 对应的是double ,而你是int a 已经错了。
sorry,我贴的时候贴错了,重点是下面的cout和printf啊,
C/C++ code?12345678#include <iostream>using namespace std;int main(){    int a;    while(scanf("%……

改过之后的2个程序运行效果一样 

#5


表示没有出现楼主说的问题

#6


scanf("%lf",&a)
scanf("%d",&a)
你确定是这两个程序的区别就在cout和printf

#7


引用 4 楼 akirya 的回复:
引用 3 楼 KnownAll 的回复:引用 2 楼 akirya 的回复:程序1 %lf 对应的是double ,而你是int a 已经错了。
sorry,我贴的时候贴错了,重点是下面的cout和printf啊,
C/C++ code?12345678#include <iostream>using namespace std;int main(){    int ……

我其实就想知道什么情况下是回车立即显示结果,而什么情况下是输入0以后才会显示结果。比如:
输入:
1[回车]
2[回车]
0[回车]
结果有两种:
一种是
#include "iostream"
using namespace std;
int main()
{
int a;
while(cin>>a&&a)
{
printf("%d\n",a);
}
return 0;
}

1
2
0
1
2
#include "iostream"
using namespace std;
int main()
{
int a;
while(cin>>a&&a)
{
cout<<a<<"\n";
}
return 0;
}

一种会是
1
1
2
2
0
很费解啊。

#8


不要混用C的scanf/printf和C++的cin/cout。两者各自有自己的缓冲区,虽然有同步机制,但是有时的确不会按照你想的来。一个缓冲区刷新了,另外一个不一定也同步刷新。

#9


引用 7 楼 KnownAll 的回复:
引用 4 楼 akirya 的回复:引用 3 楼 KnownAll 的回复:引用 2 楼 akirya 的回复:程序1 %lf 对应的是double ,而你是int a 已经错了。
sorry,我贴的时候贴错了,重点是下面的cout和printf啊,
C/C++ code?12345678#include <iostream>using namespace std;i……

你用的啥编译器?
我这里2个代码都行为都是一样的

#10


理解“流”的概念,scanf是从 当中 按格式提取信息,如果没有合适的信息可提取,那么流是不会动的。

#11


printf一样也有缓冲

#12


同求学习一下!

#13


2个的运行效果应该是一样的啊,LZ用的什么编译器啊,说明一下可以么

#14


printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

不要写连自己也预测不了结果的代码!

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

#15


引用 9 楼 akirya 的回复:
引用 7 楼 KnownAll 的回复:引用 4 楼 akirya 的回复:引用 3 楼 KnownAll 的回复:引用 2 楼 akirya 的回复:程序1 %lf 对应的是double ,而你是int a 已经错了。
sorry,我贴的时候贴错了,重点是下面的cout和printf啊,
C/C++ code?12345678#include <iostream>u……

安装vs的时候装的那个cl编译器。

#16


引用 13 楼 cheng7068 的回复:
2个的运行效果应该是一样的啊,LZ用的什么编译器啊,说明一下可以么

cl.exe

#17


引用 14 楼 zhao4zhong1 的回复:
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&amp;的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

不要写连自己也预测不了结果的代码!

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步……

恩恩,忠告不错。谢谢呢。

#18


引用 16 楼 KnownAll 的回复:
引用 13 楼 cheng7068 的回复:2个的运行效果应该是一样的啊,LZ用的什么编译器啊,说明一下可以么
cl.exe

vs版本 ?

#19



我发现,可能和notpad++有关系的,之前虽然有几次在vs2008下面运行出现两种结果不一样的情况,但是后面修改了“%lf”->“%d”的错误之后,在vs2008下面就没再出现这样的问题。但是我用notepad++配置了cl.exe 编译器编译运行的时候,就会出现上述的两种结果不一样的情况。虽然最后也没有解决,不过既然这样的话,估计应该是cl和notepad++结合的时候,出现的什么状况吧。

引用 18 楼 akirya 的回复:
引用 16 楼 KnownAll 的回复:引用 13 楼 cheng7068 的回复:2个的运行效果应该是一样的啊,LZ用的什么编译器啊,说明一下可以么
cl.exe
vs版本 ?

#20


引用 19 楼 KnownAll 的回复:
我发现,可能和notpad++有关系的,之前虽然有几次在vs2008下面运行出现两种结果不一样的情况,但是后面修改了“%lf”->“%d”的错误之后,在vs2008下面就没再出现这样的问题。但是我用notepad++配置了cl.exe 编译器编译运行的时候,就会出现上述的两种结果不一样的情况。虽然最后也没有解决,不过既然这样的话,估计应该是cl和notepad++结合的时候,出现的什么状况吧。
……

应该是你没编译成功吧

#21


引用 8 楼 Bokutake 的回复:
不要混用C的scanf/printf和C++的cin/cout。两者各自有自己的缓冲区,虽然有同步机制,但是有时的确不会按照你想的来。一个缓冲区刷新了,另外一个不一定也同步刷新。

学习了 谢谢

#22


引用 20 楼 akirya 的回复:
引用 19 楼 KnownAll 的回复:我发现,可能和notpad++有关系的,之前虽然有几次在vs2008下面运行出现两种结果不一样的情况,但是后面修改了“%lf”->“%d”的错误之后,在vs2008下面就没再出现这样的问题。但是我用notepad++配置了cl.exe 编译器编译运行的时候,就会出现上述的两种结果不一样的情况。虽然最后也没有解决,不过既然这样的话,……

成功了,就是运行的时候出问题,应该是在notepad++的控制台在按Enter的时候有什么不同的地方吧。