Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
getc()与fgetc()-主要区别是什么?_C_Fgetc_Getc - Fatal编程技术网

getc()与fgetc()-主要区别是什么?

getc()与fgetc()-主要区别是什么?,c,fgetc,getc,C,Fgetc,Getc,无论我在哪里看到“它实际上是相同的”,或类似的东西 发件人: GNUC库中还有另一个函数名为fgetc。它在大多数方面与getc相同,只是getc通常作为宏函数实现,并且经过高度优化,因此在大多数情况下更可取。(在从标准输入读取数据的情况下,getc大约与fgetc一样快,因为与计算机读取输入数据的速度相比,人类的输入速度较慢,但当您从非人类交互生成的流中读取数据时,fgetc可能会更好。) 其他的区别是什么?我听说它们各自有一个不同的实现(其中一个可以用作宏),但是,是什么使它们如此不同(或足

无论我在哪里看到“它实际上是相同的”,或类似的东西

发件人:

GNUC库中还有另一个函数名为fgetc。它在大多数方面与getc相同,只是getc通常作为宏函数实现,并且经过高度优化,因此在大多数情况下更可取。(在从标准输入读取数据的情况下,getc大约与fgetc一样快,因为与计算机读取输入数据的速度相比,人类的输入速度较慢,但当您从非人类交互生成的流中读取数据时,fgetc可能会更好。)


其他的区别是什么?我听说它们各自有一个不同的实现(其中一个可以用作宏),但是,是什么使它们如此不同(或足够不同)以致于它们都在标准C库(或规范)中呢。您应该看看它们的实现:它们是自由软件实现。现在它们可以实现为内联函数(与宏一样快)


我也不会那么麻烦了。在现实生活中,I/O主要受硬件的限制(例如访问磁盘的时间)。

来自Unix环境中的
高级编程

getc
fgetc
之间的区别在于
getc
可以 作为宏实现,而
fgetc
不能作为宏实现 宏。这意味着三件事:

  • getc
    的参数不应是具有副作用的表达式
  • 既然
    fgetc
    保证是一个函数,我们可以获取它的地址。这允许我们将
    fgetc
    的地址作为参数传递 转到另一个函数
  • 对fgetc的调用可能比对
    getc
    的调用花费更长的时间,因为调用函数通常需要更多的时间


在99.9%的案例中,这些差异似乎毫无意义

有一点可能会有所不同,即
getc()可以作为一个宏来实现,该宏对流进行多次计算

在某些情况下(不是很有用),可能会导致奇怪的行为,例如:

FILE *my_files[10] = {...}, *f=&my_files[0];
for (i=0; i<10; i++) {
    int c = getc(f++);    // Parameter to getc has side effects!
}
FILE*my_files[10]={…},*f=&my_files[0];

对于(i=0;iGood info here:@user814064,您的链接引用了
fgets
vs
fgetc
,OP询问的是
getc
vs
fgetc(),以及它的优点。@user814064,您可以直接链接到答案(通过单击共享)非常感谢。我已经发布了不到一周的时间,我还有很多东西要学习。我以为那是FaceBook或其他什么。我升了+1,但是:为什么它们都在标准库中?为什么不能都是宏?@day你的意思是“如何”如“实现细节是什么”或“你如何做到这一点(道德上或技术上)”?