- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此代码片段来自 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/
getchar_unlocked() 的内部工作原理是什么? 为什么线程不安全? 为什么它没有在 Windows POSIX 中使用? 最佳答案 getchar_unlocked() 不是线程安全的,
我的问题基于名为 Lucky Four 的 CodeChef 问题. 这是我的代码: int count_four() { int count = 0; char c = getchar_un
在这个片段中,为什么条件检查是否 ch '9' 必要。为什么不能仅使用 if 语句? #define getcx getchar_unlocked inline void inp( int &
此代码片段来自 CodeChef 中成功提交的名为 ART 的问题,为了提高速度,编码器使用 getchar_unlocked 来读取整数。但我不明白它是如何在下面的代码片段中跳出循环的?请问有人可以
这是我计算编号的代码。次 A[i]>B[j] 这样,我 #include using namespace std; int main() { int n,c=0,j=1,i; ci
我知道这段代码是如何工作的,但我找不到为什么这段代码比其他输入/输出方法更快??? int read_int() { char c = getchar_unlocked(); while(c'
我了解到使用 getchar_unlocked 是读取输入的快速方法。我在很多地方看到了代码,但无法理解。任何人都可以帮助我了解如何使用 getchar_unlocked 阅读吗?提前致谢。 void
我正在尝试解决一个 codechef 练习题 subtraction game 1使用 C 编程和代码块作为 IDE。我找到了一种比 scanf() 函数更快地读取输入的方法,但是当我运行我的程序时,
使用 getchar_unlocked 并使用 --std=c99 标志进行编译会给出如下警告- warning: implicit declaration of function ‘getchar_
这是我的代码: #include void scan(int* i) { int t=0; char c; bool negative=false; c=getcha
我正在做一个项目来证明 std::cin 比 scanf 接受输入慢,而 scanf 又比通过使用 getchar/getchar_unlocked() 等自写函数。 我想记录并打印每种情况下的执行时
这三个输入函数在编程语言中有什么区别。他们的输入方式是否不同? 1.getchar_unlocked() #define getcx getchar_unlocked inline void in
这个问题在这里已经有了答案: getchar_unlocked( ) VS scanf() VS cin (2 个答案) 关闭 8 年前。 我最近了解到 getchar_unlocked() 比正常
在 read() 函数中,当我使用 getchar() 时,它只读取一个字符。即使 while() 中的条件为真但 getchar_unlocked() 读取字符直到给定条件失败,它也会中断循环代码是
在 codechef 上用于更快输入输出的许多解决方案中,我遇到过这个表达式,但我无法理解它,因为我没有很多经验。 inline int scan( ) { int n=0; int ch=getch
我是一名优秀的程序员,十分优秀!