Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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
C 我们可以让while循环同时测试两个参数而不使用&&/||_C_Ipc - Fatal编程技术网

C 我们可以让while循环同时测试两个参数而不使用&&/||

C 我们可以让while循环同时测试两个参数而不使用&&/||,c,ipc,C,Ipc,我正在查看Beej的指南,一行代码引起了我的注意 在特定页面中,speak.c中的while循环有两个条件来检查while(get(s),!feof(stdin)) 所以我的问题是,这是怎么可能的,就像我在大多数情况下只测试一种情况时看到的那样 附言:我对这些有点陌生。我将非常感谢您的帮助。谢谢 片段 while (gets(s), !feof(stdin)) 使用逗号运算符,首先执行get(s),然后测试!feof(stdin),这是该条件的结果 顺便说一句,不要使用gets,这是非常不安全

我正在查看Beej的指南,一行代码引起了我的注意

在特定页面中,
speak.c
中的while循环有两个条件来检查
while(get(s),!feof(stdin))

所以我的问题是,这是怎么可能的,就像我在大多数情况下只测试一种情况时看到的那样

附言:我对这些有点陌生。我将非常感谢您的帮助。谢谢

片段

while (gets(s), !feof(stdin))
使用逗号运算符,首先执行
get(s)
,然后测试
!feof(stdin)
,这是该条件的结果

顺便说一句,不要使用gets,这是非常不安全的。小心使用它的资源,它们可能不是学习语言的好资源

代码

while(gets(s), !feof(stdin)) {
    /* loop body */
}
相当于

gets(s);
while(!feof(stdin)) {
    /* loop body */
    gets(s);
}

更简洁,因为它避免了在循环之前和循环体中重复
get

此测试使用,并已被用作使用
get
获取下一行文本的方法,以及使用
测试文件结尾!feof(stdin)

此语法不计算两个表达式。它首先执行
获取的
,然后计算
!feof(stdin)
可以通过
gets()
函数调用对其进行修改


这不是一个很好的方法,因为它都使用了
get()
,这不是一个安全的函数,对于初学者来说读起来很不方便(这就是你的问题)。

一些人已经指出了其中的一些问题。我当然同意使用
get
(完全)是一个糟糕的想法

不过,我认为值得一提的是另一个细节:由于这使用了
feof(file)
作为退出循环的条件,因此如果在文件结束之前遇到错误,它也可能/将表现不好。当发生错误时,将设置错误标志,但(通常)不会设置EOF标志,并且由于您无法再从文件中读取(由于错误),因此也不会设置错误标志,因此这将进入无限循环

正确的方法是使用
fgets
,并检查其返回值:

while (fgets(s, length_of_s, stdin))
    process(s);
这将测试从文件读取时是否成功执行
fgets
,因此它将退出文件结尾或错误的循环


另一个次要细节是:当
fgets
读取字符串时,它通常会在行尾保留新行(其中
获取
将其丢弃)。如果有新行,您可能需要添加更多的代码来删除它(如果新行不存在,则可能需要处理比您分配的缓冲区长的行)。

如果您发现1990年之后编写的书籍/指南使用了
get
任何东西,您应该烧掉它。作者是无能的,你会从阅读他们的例子中发现非常坏的习惯…@R。。Beej的指南是一个f#king暴行,应该从互联网上删除,引用的代码应该是他在海牙的死刑审判中的附件a。哇,真是太糟糕了……请注意,如果代码的原始版本没有换行,它会丢弃文件的最后一行。