أنواع الأحرف في لغة C: مميزة أم مكافئة؟
في لغة C، قد يختلف سلوك أنواع الأحرف (char) أحيانًا عن سلوك أنواع الأحرف الأعداد الصحيحة الموقعة وغير الموقعة، مما يؤدي إلى الارتباك. على وجه التحديد، يوضح التعليمة البرمجية التالية هذا الاختلاف:
#include
typedef signed char int8;
typedef unsigned char uint8;
struct TrueType {};
struct FalseType {};
template
struct isX
{
typedef typename T::ikIsX ikIsX;
};
template struct isX { typedef FalseType ikIsX; };
template struct isX { typedef FalseType ikIsX; };
template struct isX { typedef FalseType ikIsX; };
template bool getIsTrue();
template bool getIsTrue() { return true; }
template bool getIsTrue() { return false; }
int main(int, char **t )
{
cout ::ikIsX >() ::ikIsX >() ::ikIsX >() يتم تجميع هذا الرمز ولكنه ينتج نتائج مختلفة لـ char مقارنة بـ int8 و uint8. وذلك لأن لغة C تتعامل مع char وsigned char وunsigned char كثلاثة أنواع مختلفة.
في المقابل، int وuint32 هما نوعان متكافئان:
template struct isX { typedef FalseType ikIsX; };
template struct isX { typedef FalseType ikIsX; };
ينبع هذا التمييز من حقيقة أن char تم استخدامه تاريخيًا لتمثيل الأحرف وتخزين القيم الرقمية. ونتيجة لذلك، تحافظ لغة C على التوافق مع الإصدارات السابقة من خلال التعامل مع الحرف العادي كنوع منفصل، يختلف عن int.
لتحديد أي من التمثيلين يستخدم char، فإن typedef المحدد بالتنفيذ char_traits::signed هو متاح. إذا كان هذا صحيحاً، يتصرف char كنوع موقّع؛ وإلا فإنه يتصرف كنوع غير موقع.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3