[英]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.