SORU
3 EYLÜL 2014, ÇARŞAMBA


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
3 EYLÜL 2014, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Howard Pinsky

    Howard Pinsk

    6 AĞUSTOS 2006
  • The Amazing Atheist

    The Amazing

    20 Kasım 2006
  • Thehalopianoplayer

    Thehalopiano

    4 ŞUBAT 2011