SORU
9 Ocak 2011, Pazar


Tanımsız davranış ve sıra noktaları yeniden

Bu konu aşağıdaki konuda bir netice göz önünde bulundurun:

Önceki taksitUndefined behavior and sequence points

Bunu yeniden değerlendirelimkomikvekıvrıkifade (italik ifadeler yukarıda konu *gülümseme* dan alınmıştır ):

i  =   i;

Bu tanımsız davranış çağırır diyoruz. Bunu söylerken, dolaylı olarak kabul sanıyorumyazıni-yerleşik türlerinden biri.

Bu neyazıni kullanıcı tanımlı bir tip mi? Onun tipi daha sonra bu yazı tanımlanan Index (aşağıya bakınız) olduğunu söylüyorlar. Hala tanımlanmamış bir davranış çağırmak olur mu?

Evet ise, neden? i.operator =(i.operator ()); yazma eşdeğer veya 11 ** sözdizimsel olarak basit bile? Ya, tanımsız davranış çağırmak mı?

Hayır ise, neden olmasın? Sonuçta, 12* *nesne değiştirilmiş oluriki kezardışık sıra noktaları arasında. Lütfen başparmak kuralı hatırlayın: an expression can modify an object's value only once between consecutive "sequence points. Ve eğer i = i bir ifade ise tanımsız davranış çağırmak gerekir. Eğer öyleyse, o zaman onun benzerleri i.operator =(i.operator ()); i.add(i.inc()); de doğru gibi görünüyor tanımsız davranış çağırmak gerekir! (anladığım kadarıyla)

Ya da, i = i değilifadebaşlamak için? Eğer öyleyse, Peki nedir o zamanifade?

Eğer bir ifade olsaydı, ve aynı zamanda, onun davranışayrıcaiyi tanımlanmış, daha sonra sırası puan sayısı bir ifade ile bir şekilde ilişkili bağlıdır anlamına geliryazınişlenen bu ifade söz konusu. Doğru (kısmen bile olsa).


Bu arada, bu nasıl bir ifade?

//Consider two cases:
//1. If a is an array of a built-in type
//2. If a is user-defined type which overloads the subscript operator!

a[  i] = i; //Taken from the previous topic. But here type of `i` is Index.

Bu yanıt kesin davranışı biliyor) çok düşünmeniz gerekir. :-)


      i;

iyi tanımlanmış bir C 03? Sonuçta, bu

((i.operator  ()).operator  ()).operator  ();

class Index
{
    int state;

    public:
        Index(int s) : state(s) {}
        Index& operator  ()
        {
            state  ;
            return *this;
        }
        Index& operator =(const Index & index)
        {
            state = index.state;
            return *this;
        }
        operator int()
        {
            return state;
        }
        Index & add(const Index & index)
        {
            state  = index.state;
            return *this;
        }
        Index & inc()
        {
            state  ;
            return *this;
        }
};

CEVAP
9 Ocak 2011, Pazar


Kod gibi görünüyor

i.operator =(i.operator   ());

İşleri gayet iyi olan dizi puan getirmedi. ISO C standardı bölüm 1.9.17 bu konuda sırası puan ve işlev değerlendirmesi " der

Ne zaman arama fonksiyonu (ya da değil işlevidir içi), bir dizi noktadan sonra değerlendirme tüm fonksiyon değişkenleri (varsa) gerçekleşir önce yürütme herhangi bir ifade veya ifadeler işlevi vücudun. Ayrıca döndürülen bir değer kopyalama ve işlevi dışında herhangi bir ifade idamdan sonra önce sıra bir nokta var.

Bu operator = parametre olarak i.operator () değerlendirme sırası sonra haklı olduğunu gösteriyor, örneğin. Aşırı yüklü operatörler fonksiyonlar için, kısa, normal sıralama kuralları uygulanır.

Büyük soru, bu arada! Ben zaten biliyordum düşündüm bir dilin tüm nüansları (ve ben biliyordum düşündüm düşündüm anlamak için zorluyorsunuz. :-)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • calicoJake

    calicoJake

    29 EKİM 2007
  • DrePwn

    DrePwn

    22 Temmuz 2011
  • MisterBrightside

    MisterBright

    24 Mart 2006