"And" و اليسار الحشو في C++
-
01-10-2019 - |
سؤال
لدي الماكرو التي تبدو شيئا مثل هذا:
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++ الكثير تسمح لنا للتخلص من المعالج لكثير من الأشياء ، لأنه سيء التصرف ، وخطيرة.إذا كنت تستطيع أن تفعل دون ذلك ، القيام بذلك.
(وإذا كنت تستخدم ذلك ، على الأقل يكون رحمة على تلك الاضطرار إلى التعامل مع التعليمات البرمجية الخاصة بك في وقت لاحق إلى جعل وحدات الماكرو جميع الأحرف الكبيرة.)