SORU
14 Kasım 2010, Pazar


Tanımsız davranış ve sırası puan

Ne "sıra noktalar" mı?

Tanımsız davranış ve sıra noktaları arasındaki ilişki nedir?

Ben sık sık kendimi daha iyi hissetmek için a[ i] = i;, tuhaf ve anlaşılması güç ifadeler kullanın. Neden bunları kullanmaya devam etmeli miyim?

Eğer bu okuduğunuz, takip soru ziyaret edinUndefined behavior and sequence points reloaded.

(Not: Bu Stack Overflow's C FAQ için bir giriş olarak tasarlanmıştır. Eğer bu formda bir SSS sağlama fikri tenkit etmek istiyorsanız, o zaman the posting on meta that started all this bunu yapmak için bir yer olurdu. Cevaplar soru izlenen C chatroom nereye SSS fikir başladı ilk başta, bu da senin cevabın çok muhtemel alın okuyun o kim buldu bu fikri.)

CEVAP
14 Kasım 2010, Pazar


C 98 ve C 03

Bu cevap C standart eski sürümler için. Standart C 11 ve C 14 sürümleri resmen içermez 'sıra noktaları; operasyonlar' 'veya' unsequenced 'veya' indeterminately sıralı 'yerine. önce sıralı' Net etkisi temelde aynıdır, ama terminoloji farklı.


Yasal UyarıTamam. Bu cevap biraz uzun. Bu yüzden okurken sabır var. Eğer bunları zaten biliyorum, tekrar bunları okurken seni deli yapmaz.

Ön koşul: C Standard temel bir bilgi


Ne Sırası Puan?

Standart söylüyor

Yürütme belirli noktalarda dizisi denirsıra noktalarıtümyan etkileriönceki değerlendirmeler tam olacaktır ve hayıryan etkilerisonraki değerlendirmeler yer almış.". (§1.9/7)

Yan etkisi var mı? Yan etkileri nelerdir?

Bir ifade değerlendirme bir şeyler üretir ve ayrıca yürütme ortamı durumunda bir değişiklik olursa orada ifade (değerlendirme) bazı yan etki(ler) sahip olduğu söylenir.

Örneğin:

int x = y  ; //where y is also an int

Başlatma işlemi için ayrıca y değerini operatörün yan etkisi nedeniyle değişiyor.

Şimdiye kadar çok iyi. Sıra noktaları geçiyorum. Seq-puan değişim bir tanım comp tarafından verildi.lang.c 12 ** yazar:

Sıra nokta, toz yerleşmiş bir zamana ve şimdiye kadar görülmüş olan tüm yan etkiler komple garantisi vardır.


Ne sıra ortak noktaları C Standardı listelenen ?

Bunlar:

  • tam ifade (§1.9/16) (tam ifade başka bir ifade ifadeyi olmadığını ifade etmek için kullanılır.) değerlendirme sonunda1

Örnek :

int a = 5; // ; is a sequence point here
  • ilk yorumuna(§1.9/18) sonra aşağıdaki ifadelerin her bir değerlendirme2

    • a && b (§5.14)
    • a || b (§5.15)
    • a ? b : c (§5.16)
    • a , b (§5.18) 20* , * virgül operatörü değil (sadece bağımsız a a arasında bir ayırıcı. Eğer a ilkel bir tür olarak kabul edilir Eğer bu durumda tanımsız davranış)
  • bir işlev çağrısı veya satır içi işlevi olup olmadığı () işlevi, bağımsız değerlendirme sonucunda (varsa) tüm ifadeleri yürütme önce gerçekleşir ya da fonksiyonu vücut ifadeleri (§1.9/17).

1 : Not : olmayan taşıyıcının değerlendirilmesi içerebilir tam ifade değerlendirme lexically tam ifade parçası. Örneğin, taşıyıcının varsayılan bağımsız değişken ifadeleri (8.3.6) değerlendirme dahil bu işlev, varsayılan bağımsız değişkeni tanımlayan bir ifade bile çağıran ifadede oluşturulan olarak kabul edilir

2 : operatörler yerleşik Madde 5'de açıklandığı gibi operatörler, belirtilen. Ne zaman biri bu operatörler ise aşırı (madde 13) geçerli bir bağlam, böylece belirleme kullanıcı tanımlı bir operatör fonksiyonu, ifadesi belirtir bir fonksiyon çağırma ve işlenen şeklinde bir argüman listesi olmadan bir ima sırası noktası arasında.


Tanımsız Davranış nedir?

Standart Bölümünde Tanımsız Davranış §1.3.12 olarak tanımlar

bu Uluslararası Standart getiren davranış, hatalı bir program veya veri yapısı hatalı kullanımı üzerine ortaya olabilir gibihiçbir gereksinimleri3.

Tanımsız davranış da bu zaman beklenebilir Uluslararası Standart davranış herhangi bir açık tanım açıklaması atlar.

3 : tamamen tahmin edilemeyen sonuçlar, çevre belgelenmiş bir şekilde karakteristik çeviri ya da programın çalışması sırasında davranmaya durumu görmezden izin tanımsız davranış aralıkları (veya ile- dışarı tanı bir mesaj verilmesi), çeviri veya yürütme iptal etmek (teşhis bir mesaj verilmesi ile).

Kısacası, tanımsız davranış anlamına gelirhiçbir şeycinleri kız arkadaşına burnundan uçan olabilir hamile.


Tanımsız Davranış ve Sıra Noktaları arasındaki ilişki nedir?

Bu işe girişmeden önce fark(s) Undefined Behaviour, Unspecified Behaviour and Implementation Defined Behaviour arasında bilmeniz gerekir.

Ayrıca the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified bunu biliyor olmalısın.

Örneğin:

int x = 5, y = 6;

int z = x     y  ; //it is unspecified whether x   or y   will be evaluated first.

Başka bir örnek here.


Şimdi §5/4 Standart diyor

  • 1)Önceki ve sonraki sıra nokta arasındaki skaler bir nesne saklanan değeri en fazla bir yorumuna göre modifiye eder.

Bu ne anlama geliyor?

Gayri resmi olarak iki sıra noktaları arasında bir değişkeni birden fazla kez değiştirilmesi gerekir anlamına gelir. İfade deyimi, next sequence point genellikle sonlandırıcı noktalı virgül ve previous sequence point önceki deyimi sonunda. Bir ifade de sequence points Ara içerebilir.

Cümle yukarıdaki şu ifadelere Tanımsız Davranış çağırmak.

i   *   i; // i is modified more than once
i =   i    // same as above
  i = 2;   // same as above
i =   i  1 // same as above
      i;   //parsed as (  (  (  i)))

i = (i,  i,  i); // Undefined Behaviour because there's no sequence point between `  i`(right most) and assignment to `i` (`i` gets modified more than once b/w two SP)

Ama aşağıdaki ifadeler iyi

i = (i,   i, 1)   1; //well defined (AFAIK)
i = (  i,i  ,i) // well defined 
int j = i;
j = (  i, i  , j*i); // well defined

  • 2)Ayrıca, önceki değeri yalnızca depolanacak değerini belirlemek için erişilebilir.

Bu ne anlama geliyor? Bir nesnenin tam bir anlatım içinde, her türlü yazılı ve aynı ifade içinde tüm erişirse demektirdeğeri hesaplama doğrudan ilgili yazılmış olması gerekir.

i = i 1 i tüm erişim (R. H. S H. L. S)doğrudan dahil hesaplamayazılmaya değer. Güzel.

Bu kural etkili olan erişir zira değişiklik öncesinde bu yasal ifadeleri sınırlar.

Örnek 1:

std::printf("%d %d", i,  i); // invokes Undefined Behaviour because of Rule no 2

Örnek 2:

a[i] = i   // or a[  i] = i or a[i  ] =   i etc

çok aç, çünkü bir kere i (a[i]) ilgisi yok değeri biter olmaktan saklı ben (olan şey üzerinde i ), ve bu yüzden orada iyi bir yol tanımlamak için--ya anlayışımızı ya da derleyici ... olup erişim alır yerleştirmeden önce veya sonra artan değeri saklanır. Davranışı tanımsızdır.

Örnek 3 :

int x = i   i   ;// Similar to above

here cevap izleyin.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Austin Evans

    Austin Evans

    5 AĞUSTOS 2007
  • Bach Vlogs

    Bach Vlogs

    18 HAZİRAN 2011
  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006