ما الفرق بين undefined و unspecified و implementation-defined behavior في C++؟
مرحبًا أيها الزملاء! أكتب بلغة C++ منذ حوالي نصف عام، وأواجه باستمرار مصطلحات undefined behavior (UB)، unspecified behavior و implementation-defined behavior. كثيرًا ما أقرأ في المنتديات أن UB هو "شيء مخيف" يمكن أن يتسبب في "انفجار" البرنامج، لكنني لا أفهم تمامًا الفرق بين هذه المفاهيم الثلاثة.
على سبيل المثال، أعلم أن إلغاء الإشارة إلى مؤشر فارغ (null pointer) هو UB. لكن ماذا عن ترتيب تقييم وسيطات الدالة؟ كتبت هذا الكود:
```cpp
#include
int foo() { std::cout << "foo "; return 1; }
int bar() { std::cout << "bar "; return 2; }
int main() {
int x = foo() + bar(); // ما هو ترتيب الإخراج؟
std::cout << x;
return 0;
}
```
في مترجمات مختلفة (GCC و Clang) حصلت على مخرجات مختلفة: مرة "foo bar 3" ومرة "bar foo 3". لم يشتكي المترجم، الكود عمل، لكن النتيجة كانت مختلفة. هل هذا UB؟ أم شيء آخر؟
مثال آخر: حجم نوع `int`. أعلم أن `sizeof(int)` قد يكون 4 بايت على منصة واحدة و2 أو 8 على أخرى.