以下代码含义/做什么?

时间:2014-07-13 02:36:08

标签: c

我认为这是一种用C语言写作的奇怪方式,但我知道我以前见过它。我无法回想起这条线的作用。这是一个长循环的开始,那么它是如何工作的呢?

if(ret_val = fgets(st, n, stdin));

这个if语句是如何工作的?

3 个答案:

答案 0 :(得分:3)

该语句末尾的分号使if语句完全无用。

删除分号后,if语句形式非常糟糕,应该重写为

if ( (ret_val = fgets(st, n, stdin)) != NULL )
{
}

ret_val = fgets(st, n, stdin);
if ( ret_val )
{
}

它形成错误的原因是错误地使用赋值运算符=是一个常见错误,其中等于运算符==是预期的。上面显示的两种形式清楚地表明,作业是有意的,而不仅仅是一个错字。

答案 1 :(得分:1)

来自this网站

  

C库函数char * fgets(char * str,int n,FILE * stream)从指定的流中读取一行并将其存储到str指向的字符串中。当读取(n-1)个字符,读取换行符或达到文件结尾时(以先到者为准),它会停止。

答案 2 :(得分:0)

需要考虑的几件事情;

(1)fgets的返回值:

  • 成功时,fgets返回str
  • 成功时,如果遇到文件结束,则设置eof指示符
  • 成功时,如果遇到文件结束,并且没有读取字符,则返回NULL
  • 如果发生读取错误,则返回NULL

(2)使用赋值语句,返回左侧的值。这是标准行为,C99标准的第6.5.16节:“赋值表达式具有赋值后左操作数的值”

因此,在上面的前两种情况中,赋值表达式返回指向字符串的指针,最后两种情况下赋值表达式返回NULL。因此,在前两种情况下,执行if子句的主体,在最后两种情况下,如果不执行if子句的主体。

所以底线是op发布的代码行等同于这两行:

ret_val = fgets(st, n, stdin);
if(ret_val);

希望这有帮助。