Can';我不明白最后的do while循环是如何工作的

Can';我不明白最后的do while循环是如何工作的,c,do-while,C,Do While,我正在尝试,但就是不知道程序中最后一个do-while循环是如何工作的。 它应该从文件的末尾到第一个位置打印文件的字符,并在跨越文件边界时终止。 我展示的代码是有效的,但我不知道如何使用。 虽然条件是我似乎无法理解的,为什么不是符号呢!与while中的条件一起使用 #include <stdio.h> int main() { long n, k; char c; FILE *fp; fp = fopen("RANDO

我正在尝试,但就是不知道程序中最后一个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');
}
#包括
int main()
{
长n,k;
字符c;
文件*fp;
fp=fopen(“随机”、“w”);
而((c=getchar())!=EOF){
putc(c,fp);
}
n=ftell(fp);
printf(“\n用户输入的字符数为:%ld\n”,n);
fclose(fp);
fp=fopen(“随机”、“r”);
k=0L;
while(feof(fp)==0){
fseek(fp,k,0);
n=ftell(fp);
c=getc(fp);
printf(“位于%ld位置的字符是%c\n”,n,c);
k+=5L;
}
fseek(fp,-1L,2);
做{
printf(“%c”,getc(fp));
}而(!fseek(fp,-2L,1));
putchar('\n');
}

这段代码工作得很好,只是不理解为什么,没有使用上一个while中的条件“!”,因为我想使用相同的条件,但没有not部分

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

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

有问题的
while
循环的谓词

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

。。。因此可以解释为“调用
fseek(fp,-2L,1)
,如果成功,则执行另一个迭代,如返回0所示”。调用尝试向后移动,越过刚刚读取(和打印)的字符,向前移动超过另一个字符,如果成功,则下一个读取的字符将是文件中前一个读取字符的前一个字符。

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

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

有问题的
while
循环的谓词

while(!fseek(fp, -2L, 1))
。。。因此可以解释为“调用
fseek(fp,-2L,1)
,如果成功,则执行另一个迭代,如返回0所示”。调用尝试向后移动,越过刚刚读取(和打印)的字符,向前移动超过另一个字符,如果成功,则下一个字符读取将是文件中前一个字符读取的前一个字符。

成功时返回
0
,不成功时返回非零值

返回值

因此,当它成功时,它将返回
0
,当它成功时,您希望继续。因此,
not
在成功时返回
0
,在不成功时返回非零值

返回值


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

“此代码工作正常”和
while(feof(fp)=0{…c=getc(fp);printf(“…是%c\n”,c);
是可疑的,因为它打印的字符值为
(unsigned char)EOF
“此代码工作正常”和
while(feof(fp)==0){…c=getc(fp);printf(“…是%c\n”,c);
是可疑的,因为打印值为
(无符号字符)EOF
“c没有单独的布尔数据类型。“不同意C99之后,有一个
\u Bool
,规范称之为布尔类型,一个足够大的对象来存储值0和1。好了,@chux,我希望我的修订语言现在是令人满意的精确。布尔,
\u Bool
问题是相切的,它在这里不起作用。
while(表达式)
simple将表达式与0进行比较。所讨论的表达式涉及逻辑求反运算符@chux,它至少受到布尔逻辑的启发。此外,将该运算符应用于
fseek()的返回值的原因和/或意义
,一个
int
,是OP的一个明确的混淆点。这就是布尔值问题的重要性所在(我同意,这不是特别重要的问题,但你提到了)。“C没有单独的布尔值数据类型。”不同意C99之后,有一个
\u Bool
,规范称之为布尔类型,一个足够大的对象来存储值0和1。好了,@chux,我希望我的修订语言现在是令人满意的精确。布尔类型