Bu konuyu aşağıdaki konunun bir devamı olarak düşünün:
Önceki taksit
Tanımlanmamış davranış ve sıra noktaları
Bu komik ve kıvrımlı ifadeyi tekrar gözden geçirelim (italik ifadeler yukarıdaki konudan alınmıştır * gülümseme *):
i += ++i;
Bunun tanımsız davranışı çağırdığını söylüyoruz. Bunu derken, biz örtülü farz farz türü arasında i
yerleşik türlerinden biridir.
Ya tip ait i
kullanıcı tanımlı türüdür? Index
Bu yazıda daha sonra tanımlanan türünün olduğunu söyleyin (aşağıya bakın). Yine de tanımsız davranışa neden olur mu?
Cevabınız evet ise neden? Yazmakla eşdeğer, i.operator+=(i.operator++());
hatta sözdizimsel olarak daha basit değil i.add(i.inc());
mi? Yoksa onlar da tanımlanmamış davranışa mı başvururlar?
Hayır ise, neden olmasın? Sonuçta, nesne ardışık sıralama noktaları arasında iki kezi
değiştirilir . Lütfen pratik kuralı hatırlayın: Bir ifade, bir nesnenin değerini ardışık "sıra noktaları arasında yalnızca bir kez değiştirebilir . Ve eğer bir ifade ise, o zaman tanımsız davranışı çağırmalıdır. Eğer öyleyse, eşdeğerleri ve ayrıca tanımsız davranışı çağırmalıdır. doğru değil gibi görünüyor! (anladığım kadarıyla)i += ++i
i.operator+=(i.operator++());
i.add(i.inc());
Yoksa başlamak için i += ++i
bir ifade değil mi? Eğer öyleyse, o zaman nedir ve ifadenin tanımı nedir?
Bir ifadeyse ve aynı zamanda davranışı da iyi tanımlanmışsa, bir ifadeyle ilişkili sıra noktalarının sayısının bir şekilde ifadede yer alan işlenenlerin türüne bağlı olduğunu ima eder . Doğru muyum (kısmen de olsa)?
Bu arada, bu ifade nasıl olur?
//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.
Cevabınızda bunu da göz önünde bulundurmalısınız (davranışını kesin olarak biliyorsanız). :-)
Dır-dir
++++++i;
C ++ 03'te iyi tanımlanmış mı? Sonuçta, bu 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;
}
};