2013-07-31 26 views
5

Bu kodun nasıl yürütüleceği konusunda kafam karıştı. Varsayalım ki, * y ++ ile ++ * y arasındaki fark nedir? ve ayrıca bu programın çıktısı ne olacak?* y ++ ve ++ * y arasındaki fark nedir?

#include<stdio.h> 
int main(){ 

    int x=30,*y,*z; 
    y=&x; 
    z=y; 
    *y++=*z++; 
    x++; 
    printf("%d %d %d ",x,y,z); 
    return 0; 
} 
+1

'++ * y' ve' * ++ y' hakkında düşünün. –

+0

Görüyorsunuz, işaretçilerle uğraşıyorsunuz ama bu yardımcı olabilir: http://stackoverflow.com/questions/1094872/is-there-a-difference-between-x-and-x-in-java – zztops

+1

sadece * run * bu program çıktılarını buluyor mu? (Öncelikle tanımlanmamış bir davranışı düzeltmeniz durumunda ...) –

cevap

8

ifadesi x = *y++ aynı şekilde etkiler içinde:

x = *y; 
y = y + 1; 

Ve ifadesi sadece (atama olmadan) *y++;y++; aynı ama sonra onun hiçbir şey ise, o y başlangıç ​​sonraki konuma işaret olduğunu arttırır. Bu ilk sorunun cevabı daha net olacak *y = *y + 1; (artırılır değil Pointer) :

İkinci ifadesi ++*y aynı şekilde y tarafından işaret değeri artırmak anlamına gelir varsayalım

.kodunuz:

İlk *ytemp değişkenine atanacaktır; bu nedenle, 30 atanan temp, daha sonra y değerlerinin bir değeri artar ve x konumunun (burada hiçbir değişken mevcut değil) sonra bir sonraki konuma işaret eder.

Sonraki durum: .kodunuz varsayalım: 31 için 30 den *y artışların

int x = 30, *y; 
int temp; 
y = &x; 

temp = ++*y; //this is same as *y = *y + 1; temp = *y; 

İlk değer ve daha sonra 31temp atanır (not: x şimdi 31 olduğunu). Sorunuzun

sonraki kısmı (okuma yorum):

int x = 30, *y, *z; 

y = &x;  // y ---> x , y points to x 
z = y;  // z ---> x , z points to x 
*y++ = *z++; // *y = *z, y++, z++ , that is 
       // x = x, y++, z++ 
x++;   // increment x to 31 
5

* y ++ ve ++ * y arasındaki fark nedir?

İfade durumunda *y++ ve *z++; ++ postfix sürümü * üzerinde öncelikli olduğundan, derleyici bunu şöyle görür; ++*y durumunda

*(y++) = *(z++); 

; derleyici bunu ++(*p) olarak görür ve önce işaret ettiği nesnenin değerini artırır (bu durumda x) ve sonra artırılmış değerini döndürür.Diğer olasılıklar için

özet tablosu;

Expression     Meaning 
------------------------------------------------------------------------------------- 
*y++ or *(y++)   Value of expression is *y before increment; increment y latter 
(*y)++     Value of expression is *y before increment; increment *t later 
*++y or *(++y)   Increment y first; value of expression is *y after increment 
++*y or ++(*y)   Increment *y first; value of expression is *y after increment 

DÜZENLEME: gibi onun yorumunda Eric Lippert tarafından işaret söyleyerek: İfade değeri sayının önceki *y olduğunu sonradan yanıltıcı y artırır, bunu sözcükleri Ben burada açıklamak istiyorum kullanılan ikincisi ve sonra olacak, *y ait önceki veya sonraki değeri olduğunu, sırasıyla vurgulamak ifadelerde kullanılabilir.
Yan etkinin herhangi bir sırayla üretilebileceğini unutmayın, yan etki üretme ilk ve son atanan değer veya ilk atanmış değer ve yan etki üreteci. Daha fazla ayrıntı için cevapları okuyun: - 1, 2Eric Lippert.

+0

ilk yatay kaydırma kaldır .. –

+0

sence * * y ++ '==' * (y ++) '**? ** –

+0

Evet. Bu doğru. – haccks

1

size ne operatörleri anlama ++ ve * ayrı ayrı kullanıldığı anlamına zaman inanıyoruz. Birlikte kullanıldığında, operatör önceliği devreye girer. C++ 'da ++ operatörü, * operatöründen daha yüksek bir önceliğe sahiptir. Böylece *y++*(y++) ve ++y*(++y)* anlamına gelir. Umarım bu yardımcı olur.

+1

SO'da bir hata var. "* (Y ++)" yazdım ve düzenlemeye gittiğimde açıkça görebiliyorum ama yine de sadece "(y ++)" yazıyor. –

+0

Hata değil: read: http://stackoverflow.com/editing-help –

+0

Hata değil. '' 'editörde özeldir. Bunun üzerine SSS'yi okuyun. Açıklığa kavuşturmak için düzenledim ... Ve SO'ya hoşgeldiniz. –

6

*y++ ve ++*y arasındaki fark nedir?

C bir ifadenin anlamı iki şey ile karakterize edilir: ürettiği ve hangi yan etkileri ürettikleri değeri.

ilk ifadeyi inceleyelim.

Postfix'i artış çözümleyecek daha yüksek önceliğe sahip olan, bu nedenle bu *(y++) olup.

sonek artışı bir yan etki üretir: farklı bir konuma işaret edecek y değerini değiştirir. Postfix artışı da bir değer üretir: y'un artırılmadan önce sahip olduğu değer. * operatörü daha sonra, bir değer oluşturmak için bu değerden alıntılar yapar: yani, depolamak veya almak için bir değişken olarak kullanabileceğiniz bir şey.

Ben yan etkisi önce veya dereferencing sonra herhangi bir noktada olabilir unutmayın. Eğer

q = *y++ 

söyledi o zaman ++ yan etkisi herhangi bir noktada olabilirdi.

q = *y; 
y = y + 1; 

yoksa ikisi de tamamen yasal olan

t = y; 
y = y + 1; 
q = *t; 

olarak tedavi edilebileceğini: Bu olabilir. (Tabii ki, eğer y'un kendisi yan etkiler içeren bir ifade ise, bu yan etkiler sadece bir kez üretilmelidir. Açıklık için, bu varsayımı baştan sona yapacağım.)

++*y nasıl? Bu doğrudur: *y bir değişken üretir, değişkenin içeriği artar ve ifadenin değeri artırılmış değerdir.

q = ++*y 

olarak tedavi edilebilir:

t = *y + 1; 
*y = t; 
q = t; 

veya

t = *y + 1; 
q = t; 
*y = t; 

Ol olarak, Cı etmediğini dışı amacıyla yine yan etki üretilebilir Not Yan etkileri meydana gelebilir hangi sırayla çok fazla kısıtlamalar üretmek, bu yüzden dikkatli olun.