İki değişkeni bir for
yerine döngü koşulunda artırmak istiyorum .
Yani şöyle bir şey:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
Bunun sözdizimi nedir?
İki değişkeni bir for
yerine döngü koşulunda artırmak istiyorum .
Yani şöyle bir şey:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
Bunun sözdizimi nedir?
Yanıtlar:
Yaygın bir deyim, her iki işleneni değerlendiren ve ikinci işleneni döndüren virgül operatörünü kullanmaktır . Böylece:
for(int i = 0; i != 5; ++i,++j)
do_something(i,j);
Şimdi bunu yazmış olan bir yorumcu, bunun aslında bir virgül operatörü değil, for ifadesinde özel bir sözdizimsel şeker olduğunu öne sürdü. Bunu GCC'de şu şekilde kontrol ettim:
int i=0;
int a=5;
int x=0;
for(i; i<5; x=i++,a++){
printf("i=%d a=%d x=%d\n",i,a,x);
}
X'in a'nın orijinal değerini almasını bekliyordum, bu yüzden x için 5,6,7 .. görüntülemeliydi. Bende ne var
i=0 a=5 x=0
i=1 a=6 x=0
i=2 a=7 x=1
i=3 a=8 x=2
i=4 a=9 x=3
Bununla birlikte, ifadeyi ayrıştırıcıyı gerçekten virgül operatörü görmeye zorlayacak şekilde parantez içine alırsam, şunu elde ederim
int main(){
int i=0;
int a=5;
int x=0;
for(i=0; i<5; x=(i++,a++)){
printf("i=%d a=%d x=%d\n",i,a,x);
}
}
i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8
Başlangıçta bunun virgül operatörü gibi davranmadığını gösterdiğini düşündüm, ancak ortaya çıktığı gibi, bu sadece bir öncelik sorunu - virgül operatörü mümkün olan en düşük önceliğe sahip , bu nedenle x = i ++, a ++ ifadesi etkili bir şekilde (x = i ++), a ++ olarak ayrıştırılır
Tüm yorumlar için teşekkürler, ilginç bir öğrenme deneyimiydi ve uzun yıllardır C kullanıyorum!
Bunu dene
for(int i = 0; i != 5; ++i, ++j)
do_something(i,j);
for( ; ; ((++i), (++j)) )
for(int i = 0; i != 5; (++i)) {
Ekstra parantezler, derleyiciyi bunun artık bir "artış" işlemi olmadığını düşünmesi için kandırır.
Yapmamaya çalışın!
Gönderen http://www.research.att.com/~bs/JSF-AV-rules.pdf :
AV Kuralı 199
Bir for döngüsündeki artış ifadesi, tek bir döngü parametresini döngü için bir sonraki değere değiştirmek dışında hiçbir eylem gerçekleştirmez.Gerekçe: Okunabilirlik.
Buraya, bir FOR döngüsünün artırma cümlesine ikinci bir indeksi nasıl kodlayacağımı hatırlatmak için geldim, bunu esas olarak başka bir projeye dahil ettiğim, C ++ ile yazılmış bir örnekte gözlemleyerek yapılabileceğini biliyordum.
Bugün, C # ile çalışıyorum, ancak bu konuda aynı kurallara uyacağından emindim, çünkü FOR ifadesi tüm programlamadaki en eski kontrol yapılarından biridir. Neyse ki, son zamanlarda eski C programlarından birinde bir FOR döngüsünün davranışını tam olarak belgelemek için birkaç gün geçirmiştim ve bu çalışmaların bugünün C # problemine, özellikle de ikinci indeks değişkeninin davranışına uygulanan dersler verdiğini çabucak fark ettim. .
Dikkatsiz olanlar için, gözlemlerimin bir özeti aşağıdadır. Bugün olan her şey, Locals penceresindeki değişkenleri dikkatlice gözlemleyerek, bir C # FOR ifadesinin tam olarak bir C veya C ++ FOR ifadesi gibi davrandığına dair beklentimi doğruladı.
Döngü sona erdiğinde dizin değişkenlerinizden herhangi biri kapsamda kalırsa, gerçek dizin değişkeni durumunda bunların değeri döngüyü durduran eşikten bir yüksek olacaktır. Benzer şekilde, örneğin, ikinci değişken döngü girilmeden önce sıfır olarak başlatılırsa, sondaki değeri, bir azalma değil, bir artış (++) olduğu ve içinde hiçbir şey olmadığı varsayılarak yineleme sayısı olacaktır. Döngünün gövdesi değerini değiştirir.
Squelart'a katılıyorum. İki değişkeni artırmak, özellikle bunlardan yalnızca birini test ediyorsanız hataya açıktır.
Bunu yapmanın okunaklı yolu şudur:
int j = 0;
for(int i = 0; i < 5; ++i) {
do_something(i, j);
++j;
}
For
döngüler, döngünüzün bir artan / azalan değişken üzerinde çalıştığı durumlar içindir. Diğer herhangi bir değişken için, döngüde değiştirin.
j
Bağlı olmanız gerekiyorsa i
, neden orijinal değişkeni olduğu gibi bırakıp eklemeyesiniz i
?
for(int i = 0; i < 5; ++i) {
do_something(i,a+i);
}
Mantığınız daha karmaşıksa (örneğin, aslında birden fazla değişkeni izlemeniz gerekiyorsa), bir while
döngü kullanırım .
int main(){
int i=0;
int a=0;
for(i;i<5;i++,a++){
printf("%d %d\n",a,i);
}
}
i
ve a
yerel olmanın anlamı nedir ?
Matematik kullanın. Eğer iki işlem matematiksel olarak döngü yinelemesine bağlıysa, neden matematik yapmayalım?
int i, j;//That have some meaningful values in them?
for( int counter = 0; counter < count_max; ++counter )
do_something (counter+i, counter+j);
Veya daha spesifik olarak OP'nin örneğine atıfta bulunarak:
for(int i = 0; i != 5; ++i)
do_something(i, j+i);
Özellikle bir işleve değere göre aktarıyorsanız, tam olarak istediğinizi yapan bir şey elde etmelisiniz.