我认为这是一种用C语言写作的奇怪方式,但我知道我以前见过它。我无法回想起这条线的作用。这是一个长循环的开始,那么它是如何工作的呢?
if(ret_val = fgets(st, n, stdin));
这个if语句是如何工作的?
答案 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的返回值:
(2)使用赋值语句,返回左侧的值。这是标准行为,C99标准的第6.5.16节:“赋值表达式具有赋值后左操作数的值”
因此,在上面的前两种情况中,赋值表达式返回指向字符串的指针,最后两种情况下赋值表达式返回NULL。因此,在前两种情况下,执行if子句的主体,在最后两种情况下,如果不执行if子句的主体。
所以底线是op发布的代码行等同于这两行:
ret_val = fgets(st, n, stdin);
if(ret_val);
希望这有帮助。