2010-10-03 17 views
9
void main(void) 
{ 
    int x,y,z; 
    x=y=z=1; 

    z = x && y && ++z;//is this fine? 
} 

İçeren karmaşık bir anlatım Son zamanlarda dizi noktaları hakkında bir şeyler okumaya başladım ancak yukarıdaki kod örneğinin iyi olup olmadığını anlayamıyorum. Böylece ifade z = x & & y & & ++ z davranışı hakkında çok emin değilim && operatör dizisi noktası tanıtır biliyoruz. Birisi bana doğru cevabı söyle.mantıksal AND (&&)

+4

Dönüş türü:

int main(void) { int x,y,z; x=y=z=1; z = x && y && ++z;/*is this fine?*/ return 0; } 

Programınız bu uyarıyı üretir. –

cevap

-2

Evet, derlenecek.

Ama mantıksal hatalar hakkında soran eğer: bu durumda bir 0 değer (emin nihai sonuç için bildiği ifade değerlendirmesini sona çünkü

1) && operatör dizisi noktasını tanıtır değerlendirmeyi sonlandırabilir), x veya y sıfır ise ++z bölümüne bile ulaşmaz.

2) && işleci mantıksal olduğundan, sonuç her zaman 0 veya 1 olacaktır ve bunun istediğiniz şey olduğundan şüphe duyuyorum. C

6

++ 03.

void main(void) 
{ 
    int x,y,z; 
    x=y=z=1;         // Seq1 at ; 

    z = x && y && ++z;//is this fine?   // Seq2 at ; 
} 

Not: var dizisi noktası operatör & & sahiptir, ancak daha sonra bu, bu örnekte ilgili değildir unutmayın.

Fine! Genel olarak, olmayabilir veya olmayabilir. X ve y değerlerine bağlıdır. Özel durumunuzda, iyi değil. Bu kod, undefined behavior adında bir şeye sahip olma potansiyeline sahiptir. daha sonra skaler 'Z', iki sekans arasında ekspresyon içinde bir kereden daha fazla modifiye edilir (daki örnekte olduğu gibi x ve y 1 çünkü) Z ++ değerlendirilmişse

, SEQ1 ve Seq2 (aşağıya bakınız) işaret eder. Ödev operatörünün herhangi bir sıralama noktası koymadığını not etmek önemlidir. Aksi belirtilmedikçe/4-"

$ 5, sipariş bireysel operatörleri ve bireysel ifadelerin subexpressions ve yan etkileri gerçekleştiği düzenin işlenenlerden değerlendirmenin , unspecified.53 olduğunu) önceki ve sonraki dizi nokta skalar nesne arasında bir ifadenin değerlendirilmesi ile en fazla bir kere tadil edilmiş depolanmış değeri sahip olacaktır. Bundan başka, önceki değeri de sadece erişilebilir olacaktır Saklanacak değerini sonlandırın. Bu paragrafının gereksinimleri, tüm bir ifadenin alt ifadelerinin izin verilen sıralaması için karşılanacaktır; aksi davranış ". Tanımsız C++ 0x olarak

Kendimi @litb ile anılan tartışmanın ayrıntıları anladıktan sonra

güncellemek olacaktır.Şimdilik, sadece anladığım kadarıyla, dizi noktalarının hiçbir kavram vardır, ancak C++ 0x ile

kapalı çarpıcı ediyorum. Bu ifade gayet iyi ve tanımlanmamış davranışları çağırmıyor. Bunun nedeni, ++'nın 'z' üzerindeki etkisinin, atamanın 'z' üzerindeki yan etkisinden önce sıralanmasıdır.

$ 1,9/15- "belirtildiği yerler, bireysel operatörlerin işlenenlerden ve tek ifadelerin alt ifadelerin değerlendirmeler unsequenced [Not vardır hariç:. Bir ifadesi yılında sırasında bir kez fazla değerlendirildiği bir programın çalıştırılması, onun alt ifadelerin dizilenmemiş ve belirsiz dizilenmiştir değerlendirmeler farklı değerlendirmelerde sürekli olmak zorunda değildir.arasında ucuna bağlı bir vaziyette not] değeri hesaplamaları Bir operatörün 210 işlenen operatörün sonuç değeri hesaplama önce dizilenir. skalar nesne üzerinde bir yan etki, aynı sayısal nesne başka yan etki veya değer, aynı sayısal nesnenin kullanılarak bir değer hesaplama birine unsequenced göre ise, davranışı tanımlanmamıştır.

$ 3,9/9 - "Aritmetik türleri (3.9.1), sıralama türleri, işaretçi türleri, üye türleri (3.9.2), Std :: nullptr_t için işaretçi ve bunların CV-kalifiye versiyonlar (3.9.3), skaler türleri olarak adlandırılan şeklindedir. "

Not bu ifadede 'z = z ++;' z, bir skalar değişkendir, atama operatörü ve postfix operatörü ++ 'dan dolayı' z 'üzerindeki yan etkiler ayrıştırılmamıştır (her ikisi de diğerinden önce sıralanmamıştır).

Teşekkür @Prasoon Bu hat gayet veya is derleyici kontrol izin vermeyin olmadığını bilmek orijinal sürümüne

+2

@Prasoon Saurav: neredesin? – Chubsdad

+2

@Chubsdad: davranış x' ve 'y' 'değerlerine bağlı olarak tanımlanmamış olacaktır. Ancak biz ', x = 1' ve 'y = 1' böylece de değerlendirilmesi ++ z' z' iki dizi nokta [atama ve Ön artırma arasında bir kereden daha fazla modifiye edilmiş olan ', çünkü bu nedenle davranış tanımlanmamış olacaktır, garanti 'z' herhangi bir müdahale sırası olmadan iki kez değiştirir]. Gönderinizin, C++ 0x taslağından alıntı içerdiğini unutmayın. C++ 0x 'i = ++ i' iyi tanımlanmış bir davranıştır. –

+0

Cevabınızı şimdi cevaplandırdı. :) –

2

basit bir yolu, bu yazı rafine değerli girdiler verdiği için. Örneğin, gcc çünkü dizi noktalarının olmaması davranışını orada tanımsız eğer kontrol etmek için (-Wall olarak etkindir) the -Wsequence-point option sahiptir. C C ve `ana()` olmalıdır `int` ++ ait

 
x.c: In function 'main': 
x.c:6:5: warning: operation on 'z' may be undefined 
+0

gcc, sadece bu tür bir kod için 'movb $ 0,0' veya eşdeğerini oluşturmak yerine bunun hakkında uyarılar üretmek için özel bir seçenek gerektiriyor. –

İlgili konular