gpt4 book ai didi

c - 如何使用 getchar_unlocked(),我没有得到以下代码中的流程?

转载 作者:行者123 更新时间:2023-11-30 15:07:10 28 4
gpt4 key购买 nike

此代码片段来自 CodeChef 中成功提交的名为 ART 的问题,为了提高速度,编码器使用 getchar_unlocked 来读取整数。但我不明白它是如何在下面的代码片段中跳出循环的?请问有人可以帮我解决这个问题吗?完整代码可见here .

#include <stdio.h>
#define g getchar_unlocked

int read()
{
int n=0;
char c=g();

while(c<'0' || c>'9')
{
c=g();
}
while(c>='0' && c<='9')
{
n = (n<<3) +(n<<1) +c - '0';
c=g(); // putting it here is giving a unusual behaviour!!!!! like not taking the input and coming out of loop ???
}
return n;
}

最佳答案

确实,定义名为 read 的全局函数(或 http://pubs.opengroup.org/onlinepubs/9699919799/idx/functions.html 列表中的任何其他名称)可能会导致 C 库发生故障,但我'我不确定这是否会上升到 C 标准所使用的“未定义行为”的级别,并且我实际上无法在我可以方便访问的任何操作系统上发生问题。

所以,忽略这一点,这是您再次询问的循环:

    while (c >= '0' && c <= '9')
{
n = (n<<3) + (n<<1) + c - '0';
c = getchar_unlocked();
}

你说你不明白的是“它是如何跳出循环的”。首先, getchar_unlocked 就像 getchar 一样,只是它不是线程安全的(因此可能更快)。它从标准输入按顺序返回字符。 while循环只要返回的字符大于等于'0'且小于等于'9'就循环; C 标准保证数字 0123456789 是该范围内唯一的字符,并且它们以正确的顺序出现。因此,如果程序的输入是“1234”,则循环应循环四次然后停止,因为 4 之后返回的值将是 '\n'EOF,两者都不在“0”..“9”范围内...

   char c = getchar_unlocked();

...只不过程序员在使用 stdio 编程时犯了最基本的错误之一。 EOF 是一个超出 char 表示范围的值,因此要正确存储该值,c 应该是声明为int。该错误被 ASCII(和 EBCDIC)的布局掩盖,但在 char 已签名的假设实现中,EOF 的值为 -1,并且 ' 9' == (char)-1 -- 所有这些都是允许的 -- 程序将在 EOF 处进入无限循环。

关于c - 如何使用 getchar_unlocked(),我没有得到以下代码中的流程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38419227/

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