while循环不会退出C.

pol*_*nux 2 c while-loop

这是一个while循环工作片段:

while(total_bytes_read != fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
        total_bytes_read += nread;
        if(total_bytes_read == fsize) break;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个while循环的非工作片段的示例:

while(total_bytes_read != fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
        total_bytes_read += nread;
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,这是一个while循环的非工作片段的示例:

while(total_bytes_read < fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
    }
     total_bytes_read += nread;
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么进入上面的2个片段时total_bytes_read等于fsize循环不会退出:O
提前谢谢!

das*_*ght 6

片段2和3中的外部循环不会退出,因为内部循环不会退出:total_bytes_read != fsize循环永远不会有机会检查其连续条件.

片段1正常工作,因为你检查相同的条件下内部嵌套循环,并打破了,如果限制数量已经达到.

您可以将两个条件组合成一个循环,如下所示:

while((total_bytes_read != fsize) && (nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0) {
    ...
}
Run Code Online (Sandbox Code Playgroud)