簡體   English   中英

這兩者在 C 中有什么區別?

[英]what's the difference between these two in C?

在學習快速聯合算法時,我遇到了這兩個陳述

for(i=p; i!=id[i]; i=id[i]);
for(j=q; j!=id[j]; j=id[j]);

因為我只知道 for 循環是這樣的

for(i=0; i<100; i++)

我不知道這兩個陳述和以下陳述之間的區別

i=p; i=id[i];
j=q; j=id[j];

我不知道為什么結果不同?

謝謝


我想問為什么

#include <stdio.h>
#define N 10000

int main()
{
    int i, j, p, q, id[N];
    for(i=0; i<N; i++) id[i]=i;
    while(scanf("%d %d\n", &p, &q)==2)
    {
        for(i=p; i!=id[i]; i=id[i]);
        for(j=q; j!=id[j]; j=id[j]);
        if(i==j) continue;
        id[i]=j;
        printf(" %d %d\n", p, q);
    }
}

不同於

#include <stdio.h>
#define N 10000

int main()
{
    int i, j, p, q, id[N];
    for(i=0; i<N; i++) id[i]=i;
    while(scanf("%d %d\n", &p, &q)==2)
    {
        i=p; i=id[i];
        j=q; j=id[j];
        if(i==j) continue;
        id[i]=j;
        printf(" %d %d\n", p, q);
    }
}

我已經測試了結果,這就是為什么我很困惑

i=p;

i設置為變量p的值(在程序的其他地方定義和初始化)

i=id[i]

i設置為數組id的第i個元素的值(在程序中的其他地方定義和初始化)

for(i=p; i!=id[i]; i=id[i]);

循環將i初始化為p的值,如果i不等於數組id的第i個值,則執行一次 for 循環內的語句,然后停止。

進一步說明:

假設變量的一些值:

int p = 4;
int i;
int id[5] = {1,2,3,4,5};
for(i=p; i!=id[i]; i=id[i]) {
printf("Loop executed!\n");
}

輸出:

循環執行!

然后是分段錯誤。

發生什么了:

i 設置為 4,然后與 id[4] 進行比較。 這是不相等的,因此觸發了循環。 之后它將 i 設置為 5。現在它嘗試將 id[5] 與 i 進行比較。 這是不允許的,因為 id 只有 5 個元素的空間並且索引從 0 開始。

在查看像這樣的非標准“循環”時,將 for 循環轉換為 while 循環會有所幫助。 (這就是他們真正的樣子)

為此,請記住 for 循環由以分號分隔的三部分組成。 初始化部分、條件部分和更新或增量部分:

for(initialize statement; boolean loop conditional; update/increment statement);

初始化語句在循環之前執行,循環條件被評估以確定循環是否繼續,更新/增量語句在循環結束時執行。

你的第一個例子:

for(i=p; i!=id[i]; i=id[i]);

作為一個while循環,看起來像..

i = p
while(i!=id[i]) {
    i = id[i];
}

你的第二個例子:

for(j=q; j!=id[j]; j=id[j]);

作為一個while循環,看起來像..

j = q
while(j!=id[j]) {
    j = id[j];
}

一旦他們這樣寫,就更容易知道發生了什么。

我們將循環變量初始化為兩個值之一,p 或 q。

然后,我們在循環變量指定的位置查看數組“id”並用它更新循環變量。 這具有在數組中查找下一個循環變量的效果。 換句話說,數組中的每個插槽都包含要跳轉到的下一個值。

條件檢查以查看目的地是否與當前位置相同。 也就是說,如果我們“被告知”要跳到我們已經在的位置。

兩個循環之間的區別僅在於初始化值。 第一個初始化為 p,第二個初始化為 q。

手動跳過簡單的情況可能會有所幫助,例如..

p=0
q=1
id = {1,2,2}

p=2
q=1
id = {0,0,2}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM