C arasındaki fark operatörü ile ilgili C
Bazı kod ile oynaşmak ve "neden". anlamadığım bir şey gördüm
int i = 6;
int j;
int *ptr = &i;
int *ptr1 = &j
j = i ;
//now j == 6 and i == 7. Straightforward.
Eğer sol tarafında işleç eşittir koyarsan ne işareti?
ptr = ptr1;
olur denk
(ptr = ptr 1) = ptr1;
oysa
ptr = ptr1;
olur denk
ptr = ptr 1 = ptr1;
Sonek derleme hatası çalışır ve anlıyorum. Sürekli bir "" bir atama operatörünün sol tarafında. Ao 1 var Yeterince adil.
Bir önek derler ve C ÇALIŞIYOR . Evet, dağınık ve ayrılmamış bellek ile uğraşıyoruz, ama çalışıyor ve derler anlıyorum. C bu, postfix aynı hatayı döndüren derleme değil "lvalue atama olarak sol işlenen gerekiyor". Bu, " = "operatörleri veya "" sözdizimi. bildiğimiz iki ile yazılmış genişletilmiş ne kadar olur
C böyle bir atama nasıl işleyeceğini ve C nasıl işleyeceğini arasındaki fark nedir?
CEVAP
C ve C her iki x
sonucu bir rvalue, atayabilirsiniz.
C, x
x = 1
(C standart §6.5.3.1/p2; tüm C standart WG14 N1570 için cıtes) eşdeğerdir. x
C x = 1
eşdeğer bir bool
(C standart §5.3.2 [ifade.pre.incr] p1/; tüm C standart WG21 N3936) değinir.
C, bir atama ifadesi sonucu bir rvalue (§6.5.16/p3 C standart):
Atama operatörü, nesne tarafından belirlenen bir değeri depolar işlenen bıraktı. Bir atama ifadesi sol değeri vardır atama sonra işlenen, ama bir lvalue değildir.
Bir lvalue değil çünkü atama yapamazsın: (C standart §6.5.16/p2 - bu bir kısıtlama olduğunu unutmayın)
Atama operatörü sol olarak değiştirilebilir bir lvalue olacaktır işlenen.
C , bir atama ifadesi sonucu bir lvalue (C 5.17 §[ifade standarttır kıçını]/p1):
Atama operatörü (=) ve bileşik atama tüm operatörler grup soldan sağa. Tüm sol olarak değiştirilebilir bir lvalue gerektirir ve bir lvalue sol işlenen atıfta işlenen dönüş.
ptr = ptr1;
C teşhis edilebilen bir kısıtlama ihlali, ama C herhangi bir teşhis kuralı ihlal etmez .
Ancak, pre-C, *19 11* iki kere iki bitişik sıra noktaları arasında ptr
değiştirir gibi tanımsız davranış var.
C 11, ptr = ptr1
davranışını iyi tanımlanmış olur. Biz bunu yeniden yazarsanız daha net
(ptr = 1) = ptr1;
C-11, C standardı bu sağladığından (§5.17 [ifade.kıçını]/p1)
Her durumda, atama değeri hesaplama sonra sıralı değeri hesaplama önce sağ ve sol işlenen ve atama ifadesi. Bir saygı ile indeterminately-sıralı fonksiyon, bir bileşik operasyon çağrısı atama tek bir değerlendirme.
Atama =
tarafından gerçekleştirilen değeri ptr = 1
ptr1
hesaplama sonra sıralı. Atama =
tarafından gerçekleştirilen değeri ptr = 1
hesaplanması, daha önce sıralı ve tüm değer hesaplamaları =
gerekli mutlaka bu atama önce sıralı. Böylece, sıralama burada iyi tanımlanmış ve tanımlanmamış bir davranış yoktur.
Olaylar ve Temsilciler ve ilgili uygul...
Bir sınıf ve bir modül arasındaki fark...
Swing ve AWT arasındaki fark nedir?...
Arasındaki fark anahtar, Birincil Anah...
Başka bir dil JavaScript dışında ayrac...