while(tab[i+1]==0)和while(tab[++i]==0)的区别

我不明白为什么如果我使用

    while (tab[i+1] == 0)
    {
        i+=1;
    }
    while (tab[i+1] == 0)
    {
     
 while (tab[++i] == 0);
 while (tab[++i] == 0);

我的程序挂起,但如果我使用

它按其应有的方式执行。我错过了什么?

完整代码:

回答

#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <limits.h> #define SIZE 100 typedef struct { unsigned int prime; unsigned int size; unsigned int *tab; } shared_data; void *sieve(void *); sem_t mutex; int main() { pthread_t tid; unsigned int tab[SIZE]; sem_init(&mutex, 0, 0); for (unsigned int i = 0; i < SIZE; i++) { tab[i] = i; } unsigned int i = 2; //index startowy shared_data shared = {i, SIZE, tab}; while (i < SIZE) { shared.prime = tab[i]; pthread_create(&tid, NULL, sieve, &shared); sem_wait(&mutex); while (tab[++i] == 0); } pthread_join(tid, NULL); // czekaj az ostatni watek zakonczy dzialanie sem_destroy(&mutex); printf("Liczby pierwsze:n"); for (unsigned int i = 0; i < SIZE; i++) if (tab[i]) //pomin 0 przy wyswietlaniu printf("%d | ", tab[i]); printf("n"); return 0; } void *sieve(void *arg_p) { shared_data arg = *(shared_data *)arg_p; shared_data io = arg; int unlock_thread = 1; for (unsigned int i = io.prime + 1; i < io.size; i++) { if (io.tab[i] % io.prime == 0) io.tab[i] = 0; else if (unlock_thread) { sem_post(&mutex); unlock_thread = 0; } } if (unlock_thread) sem_post(&mutex); return NULL; }

>

检查 的下一个元素,当它为零时tab不改变i。这意味着i不会更改为tab[i]变为零的值。

另一方面,

首先转到下一个元素,tab因此i可以将其更改tab[i]为零。

要分离对 的访问tab和更新i,您可以这样做:

另请注意,您不得

do {
    i+=1;
} while (tab[i] == 0);

访问(不可读取或写入)超出范围的数组元素。该数组tab只有SIZE元素,因此可用索引仅0SIZE-1。这意味着您不得阅读tab[SIZE]. 您应该像这样向循环添加范围检查:

    while (++i < SIZE && tab[i] == 0);
    
    do {
        i+=1;
    } while (i < SIZE && tab[i] == 0);
    

以上是while(tab[i+1]==0)和while(tab[++i]==0)的区别的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>