SORU
16 EKİM 2010, CUMARTESİ


C99, f() g() tanımsız ya da sadece belirsiz?

Düşündüm ki C99 bile yan etkileri fonksiyonlar f g müdahale etti, ancak ifade f() g() içermeyen bir dizi nokta, f g ki bazı içerir, bu yüzden davranış olurdu belirtilmemiş: ya f() aramadan önce g () veya g() önce f().

Artık o kadar emin değilim. Derleyici fonksiyonları derleyici eğer fonksiyonları inline ilan değilse bile doğru bir karar olabilir) inlines ve sonra yeniden sıralar ne talimatı? Bir sonuç yukarıdaki iki farklı alabilirsiniz? Diğer bir deyişle, bu tanımsız davranıştır?

Bu böyle bir şey yazmayı düşünüyorum, çünkü değil, bu statik analiz böyle bir iddia için iyi bir etiket seçin.

CEVAP
16 EKİM 2010, CUMARTESİ


İfadesi f() g() içeren en az 4 sıra puan; daha önce çağrı f() (sıfır bağımsız değişkenleri değerlendirilmiştir); daha önce çağrı g() (sıfır bağımsız değişkenleri değerlendirilmiştir); bir aramayı f() döner; bir çağrı için g() döndürür. Ayrıca, iki sıra puan f() ile ilişkili bir veya iki sıra puan g() ile ilişkili sonra her ikisi de daha önce ortaya çıkar. Söyleyemezsin ne sırası puan olarak gerçekleşecek olan - f-g noktaları-noktaları veya tam tersi oluşmadan önce olsun.

Eğer derleyici kodu inlined bile, itaat ederseniz 'kural - kod fonksiyonları aralanmış olsaydı. aynı şekilde davranması gerekir gibi' olmalı Bu hasar için kapsam dışı adamcağız bir derleyici varsayarak) sınırlar.

Yani hangi f() g() değerlendirilir sırası belirtilmemiş. Ama her şey çok temiz.


Sorar: bir yorum supercat

Kaynak kodu işlevini çağırırsa bir derleyici kendi başına bunları satır karar verirse bu sıralama puan olarak kalması beklenebilir. Bu işlevleri ilan gerçek kalır"", ya da derleyici ekstra enlem mı? içi mi

'Kural geçerlidir ve derleyici inline açıkça bir işlevi kullandığından ekstra enlem sıra noktaları atlamak olmaz. eğer' olarak inanıyorum Ana nedenle düşünme (çok tembel bakmak için tam ifade standart) derleyici izin verilen satır veya satır içi işlevi göre kuralları, ama bu davranış programı değil değiştirmek dışında (performans).

Ayrıca, (a(),b()) (c(),d()) sıralama hakkında ne söylenebilir? Mümkün c() ve/veya d() yürütme arasında a() b() a() b() yürütme arasında c() d()?

  • Açıkçası, önce b yürütür, c ve d önce yürütür. Sanırım mümkün için c ve d çalıştırılacak arasında a ve b yine de oldukça düşüktür ki bu derleyici ki üret kodu gibi; benzer şekilde, a ve b olabilir idam arasında c ve d. Ben de kullanılmasına rağmen 've' 'c ve d', 'veya' bu operasyonun bu dizileri herhangi bir kısıtlamaları karşılamak: olabilir . o

    • a
    • acbd
    • acdb
    • cadb
    • cdab
    • cabd

    Bu ayrıntılı bir liste var emin değilim, ama değişik en kapsar.

Eğer böyle bir şey mümkün olsaydı, satır içi işlevleri ve makrolar arasında önemli bir fark anlamına gelir.

Satır içi işlevleri ve makrolar arasında çok büyük farklar vardır, ama ifadede sipariş veren biri olduğunu sanmıyorum. Bu işlevlerin herhangi a, b, c veya d bir makro ve makro aynı sıralama ile değiştirilebilir gövdeler oluşabilir. Temel fark, bana öyle geliyor ki, bu satır içi işlevleri, garantili sırası noktalarda işlev çağrıları olarak anlatılan ana cevap olarak en virgül operatörleri. Makrolar ile işlev ile ilgili sıra puan kaybedersiniz. (Belki de bu önemli bir fark...) Ancak, hem de birçok açıdan sorun değil gibi sorular hakkında kaç tane melek dans edebilir kafasına bir pin - değil mi çok önemli uygulama. Eğer birisi bir kod Gözden Geçirme ifadesi (a(),b()) (c(),d()) sundu, bunları açıklığa kavuşturmak için kodu yeniden yazmak için söylerdim:

a();
c();
x = b()   d();

Ve o b() vs d() kritik sıralamanın gereği yok varsayar.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AFISHAL

    AFISHAL

    7 Mart 2009
  • gsmaestro

    gsmaestro

    17 AĞUSTOS 2006
  • Wild Academy

    Wild Academy

    8 Aralık 2009