我看了一些代码,但我不知道while(~scanf
while(~scanf("%s", word+1) !=EOF)
{
int a= strlen(word+1);
我已经搜索过google,但对此一无所获。请帮助
答案 0 :(得分:5)
分析表达式while(~scanf("%s", word+1) != EOF)
:
只要
scanf
的按位取反的返回值不等于EOF
的值,就运行。
分析等效表达式while(scanf("%s", word+1) != ~EOF)
:
只要返回
scanf
的返回值不等于EOF
的按位取反的值,就运行。
假设EOF
通常为1,则该表达式本质上等效于:
while(scanf("%s", word+1) != 0)
意思是:
只要
scanf
的返回值不是0
,就运行。
或者简单地:
运行直到
scanf
的返回值为0
。
对于这种分析是否正确,我仍在scratch头。
求职面试的好问题(以及如何不编写代码的好例子)。
答案 1 :(得分:0)
成功时,scanf将返回成功匹配的输入项目数。在这种情况下,只有一个输入项要匹配,因此,成功时scanf将返回1,上面的代码将按位取反1,使其变为-2。由于-2!= EOF,因此循环不会结束。由于EOF的值为-1。
如果scanf遇到错误或到达输入结尾,例如由于用户按下Ctrl-D,它将返回EOF,并且不会在存储位置word + 1中放置新值。该代码将按位反转EOF,该值变为0,因为〜EOF = 0。由于0!= EOF,循环不会结束。对strlen的调用将返回调用scanf之前在内存位置word + 1中的字符串的长度。
仅当scanf返回0时,循环才会结束,因为〜0 = -1 = EOF。仅当scanf无法将输入与转换说明符“%s”的字符串匹配时,才会发生这种情况。