gpt4 book ai didi

c - 无法理解此 C 函数的作用

转载 作者:太空狗 更新时间:2023-10-29 15:11:13 24 4
gpt4 key购买 nike

我已经看过这段代码好几次了,但无法理解它的作用

inline char nc()
{
static char buf[100000], *L = buf, *R = buf;
return L == R && (R = (L = buf) + fread(buf, 1, 100000, stdin), L == R) ? EOF : *L++;
}

条件 L==R 应该始终为真,对吧?因为两个指针都指向同一个变量。我无法理解条件检查的第二部分。有人可以帮帮我吗?

最佳答案

所有变量都声明为static,这意味着它们保留了前一个函数调用的值。初始化 =buf 仅在第一次调用该函数时运行。这基本上与将这些变量声明为全局变量并在第一次函数调用之前对其进行初始化是一样的。当然,不同之处在于可以从代码中的任何位置访问全局变量。

让我们稍微分解一下第二行。可以这样改写:

char ret;
if(L == R &&
R = (L = buf) + fread(buf, 1, 100000, stdin), L == R) {
ret = EOF;
} else {
ret=*L; // Return the character read
L++; // Advance to next character in the buffer
}
return ret;

更清晰一些,但仍然有点笨拙。第二个条件R = (L = buf) + fread(buf, 1, 100000, stdin), L == R)不是很清楚。可以这样改写:

L = buf;
int noCharactersRead = fread(buf, 1, 100000, stdin);
R = L + noCharactersRead;
if(L == R) // If no characters have been read
ret = EOF;

所以完整的重构代码(有一些额外的重构)将是

char nc()
{
#define BUFSIZE 100000
static char buf[BUFSIZE], *L = buf, *R = buf;
if(L == R) { // If buffer is empty
L = buf; // Reset L to beginning of buffer

// Read next character from stdin, put it in the buffer
// and check if read was successful
int noCharactersRead = fread(buf, 1, BUFSIZE, stdin);

// Return EOF on read failure
if(noCharactersRead == 0)
return EOF;

// Advance R one step if a character was read
R = L + noCharactersRead;

}

// If the buffer was not empty, or if the buffer was empty and we
// successfully read a new character into the buffer, return the next
// character in the buffer and advance L
return *L++;
}

我删除了 inline 因为该函数包含静态变量。另一种方法是将函数声明为 static inline

它本质上是 getchar() 函数的缓冲版本,但是以一种非常难读的方式编写。另请注意,它对缓冲区溢出的保护非常少。它基本上依赖于缓冲区足够大而不会引起任何问题。解决此问题的一种方法是将对 fread 的调用更改为 fread(buf, 1, BUFSIZE - (R-L), stdin)

关于c - 无法理解此 C 函数的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56313965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com