سؤال

لدي الماكرو التي تبدو شيئا مثل هذا:

Foo(x) ((x - '!') & 070)

إذا كنت استدعاء التعليمات البرمجية التالية:

Foo('1') => 16

ومع ذلك ، إذا كنت استدعاء التعليمات البرمجية التالية:

(('1' - '!') & 70) => 0

لذا سؤالي هو: ماذا يحدث هنا ؟ لماذا x & 070 حساب إلى x ولكن x & 70 حساب 0?

تخميني هو أن إضافي 0 على اليسار هو إجبار 60 إلى اتخاذ 2 بايت بدلا من 1.في هذه الحالة لن المختصة بالبت & النحو التالي?

0000 0000 0001 0000     '16
0000 0000 0100 0110 &   '70
-------------------
0000 0000 0000 0000
هل كانت مفيدة؟

المحلول

في C ++ ، ثابت مع قيادة 0 هو ثابت الثمانية ، وليس ثابت عشري. لا يزال ثابتًا صحيحًا ولكن 070 == 56.

هذا هو سبب الفرق في السلوك.

نصائح أخرى

لا ، يعني الإضافي 0 أن الرقم تتم قراءته على أنه أوكتال (قاعدة 8). هذا يعني أنه لا يقول 70 ، لكن 56:

0000 0000 0001 0000     '16 
0000 0000 0011 1000 &   '56
------------------- 
0000 0000 0001 0000 

تعداد 070 مع 0 كما تفعل ، يخبر المترجم أن يفسره على أنه ثماني ، وليس عشريًا. ربما تريد أن تقول 70.

كما قال آخرون ، 070 هو ثماني (و 0x70 عشري) ثابتة ، حيث تكمن المشكلة.

أود أن أضيف ، على الرغم من أن يجب عليك استخدام inline وظائف بدلا من وحدات الماكرو:

inline int Foo(int x) { return (x - '!' & 070); }

C++ الكثير تسمح لنا للتخلص من المعالج لكثير من الأشياء ، لأنه سيء التصرف ، وخطيرة.إذا كنت تستطيع أن تفعل دون ذلك ، القيام بذلك.
(وإذا كنت تستخدم ذلك ، على الأقل يكون رحمة على تلك الاضطرار إلى التعامل مع التعليمات البرمجية الخاصة بك في وقت لاحق إلى جعل وحدات الماكرو جميع الأحرف الكبيرة.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top