无法理解while循环到底是如何工作的

时间:2017-04-26 17:36:45

标签: c do-while

我正在尝试但是无法弄清楚程序中的最后一个do-while循环是如何工作的。 它应该从末尾到第一个位置打印文件的字符,并在它跨越文件的边界时终止。 我展示的代码正在运行,但我没有得到如何。 虽然我不能理解,但为什么不符号!与while中的条件一起使用。

#include <stdio.h>

int main()
{
        long n, k;
        char c;
        FILE *fp;
        fp = fopen("RANDOM", "w");
        while ((c = getchar()) != EOF) {
                putc(c, fp);
        }
        n = ftell(fp);
        printf("\nNo. of characters entered by the user is : %ld\n", n);
        fclose(fp);
        fp = fopen("RANDOM", "r");
        k = 0L;
        while (feof(fp) == 0) {
                fseek(fp, k, 0);
                n = ftell(fp);
                c = getc(fp);
                printf("The character at %ld position is %c\n", n, c);
                k += 5L;
        }
        fseek(fp, -1L, 2);
        do {
                printf("%c", getc(fp));
        } while(!fseek(fp, -2L, 1));
        putchar('\n');
}

这段代码工作正常,只是无法理解为什么,而不是“!”使用最后一次的条件是因为我想使用相同的条件,但没有没有部分。

2 个答案:

答案 0 :(得分:2)

fseek成功返回0,失败则返回非零值。

  

返回值

If successful, the function returns zero.
Otherwise, it returns non-zero value.

因此,当它成功时,它将返回0并且您希望在它成功时继续。因此not

答案 1 :(得分:1)

对于布尔值,C没有单独的类型族。它使用整数 - 0表示false,其他任何表示true。 C99中引入的_Bool类型是可以表示这些值的整数类型,其他整数类型可以自由地用于表示布尔值。逻辑运算符!只是交换它们; !x相当于(x == 0) ? 1 : 0,它本身就等同于(x == 0)

与许多C函数fseek()一样,返回值表示其成功或失败。通常,负值表示失败,非负表示成功;详细信息略有不同,fseek()专门用0表示成功,-1表示失败。

有问题的while循环的谓词......

while(!fseek(fp, -2L, 1))

...因此可以解释为&#34;调用fseek(fp, -2L, 1)并在成功时执行另一次迭代,如返回0&#34;所示。该调用尝试向后移动经过刚刚读取(和打印)的字符,然后向前移动另一个字符,如果成功,则该效果将使下一个字符读取紧接在文件中读取的前一个字符之前的字符。