c++ - تعريفات غريبة لوحدات الماكرو TRUE و FALSE




macros boolean obfuscation (6)

لقد رأيت تعريفات الماكرو التالية في كتاب الترميز.

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

لم يكن هناك أي تفسير هناك.

يرجى توضيح لي كيف ستعمل هذه كـ TRUE و FALSE .


Answers

إنها مجرد طريقة أخرى للكتابة

#define TRUE 1
#define FALSE 0

سيؤدي التعبير '/'/'/' إلى تقسيم قيمة char من '/' حد ذاته ، مما يعطي 1 نتيجة لذلك.

'-'-'-' التعبير '-'-'-' قيمة char من '-' من نفسها ، والتي ستعطي 0 كنتيجة.

define الأقواس حول الكل مفقودات على الرغم من ذلك ، مما قد يؤدي إلى أخطاء في التعليمات البرمجية باستخدام وحدات الماكرو هذه. الجواب جاي العنوان على ما يرام.

مثال على سيناريو "الحياة الواقعية" حيث يكون نسيان الأقواس يمكن أن يكون ضارًا هو الاستخدام المشترك لهذه الماكرو مع مشغّل c-style cast. إذا قرر شخص ما إرسال هذه التعبيرات إلى bool في C ++ على سبيل المثال:

#include <iostream>

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

int main() {
    std::cout << "True: " << (bool) TRUE << std::endl;
    std::cout << "False: " << (bool) FALSE << std::endl;
    return 0;
}

إليك ما نحصل عليه:

True: 0
False: -44

لذلك (bool) TRUE سيقيّم فعلًا إلى false ، و (bool) FALSE سيقيم إلى true .


لنبدأ بالحقيقة يمكنك قراءتها كـ '/' / '/' ، مما يعني "حرف" / "مقسومًا على الحرف" / "". نظرًا لأن كل حرف ، في C ، هو قيمة رقمية (على بايت واحد) ، يمكن قراءته على أنه "قيمة ASCII للحرف" / "مقسومًا على قيمة ASCII لنفس الحرف" ، مما يعني 1 (لأنه ، بالطبع ، x / x هي 1). ومن ثم ، يكون TRUE هو 1.

بالنسبة إلى FALSE ، فإن المنطق نفسه هو: '-'-'-' reads '-' - '-' ، أي "ASCII value of '-' ناقص قيمة ASCII" - "، وهي 0. وبالتالي ، FALSE هو 0.

هذه طريقة سيئة لتوضيح ما هو واضح.


وهو ما يعادل الكتابة

#define TRUE 1
#define FALSE 0

ما يفعله التعبير '/'/'/' بالفعل هو تقسيم الحرف / (مهما كانت قيمته الرقمية) بنفسه ، بحيث يصبح 1 .

وبالمثل ، فإن التعبير '-'-'-' ينقص الحرف - من نفسه ويقيم إلى 0 .

سيكون من الأفضل أن يكتب

#define TRUE ('/'/'/')
#define FALSE ('-'-'-')

لتجنب التغير العرضي للقيم عند استخدامها مع عوامل الأسبقية الأخرى.


طريقة فرحان لكتابة وحدات الماكرو True and False .

كما تم تقديم العديد من التفسيرات / يعني عدد 1 بايت (حسب ASCII) عند تقسيمها بنفسها ، تعطيك 1 التي سيتم التعامل معها على أنها True وبالمثل - هي مرة أخرى رقم بايت عندما تطرح نفس القيمة التي تعطيها لك 0 والتي يتم تفسيره على أنه false

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

وبالتالي يمكننا استبدال / أو - بأي حرف نحب ، على سبيل المثال:

#define TRUE  '!'/'!'
#define FALSE 'o'-'o'

سيحتفظ بنفس المعنى مثل التعبير الأصلي.


أجاب Jay بالفعل لماذا تكون قيم هذه التعبيرات 0 و 1 .

من أجل التاريخ ، جاءت هذه التعبيرات '/'/'/' و '-'-'-' من أحد إدخالات المسابقة الدولية الأولى '-'-'-' Obfuscated C Code في عام 1984 :

int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}

(رابط إلى البرنامج here ، هناك تلميح حول ما يفعله هذا البرنامج في صفحة IOCCC أعلاه).

أيضا إذا كنت أتذكر بشكل صحيح هذه التعبيرات كما macros مبهمة ل TRUE و FALSE تم تغطيتها أيضا في كتاب "Obfuscated C و Mysteries أخرى" من قبل Don Libes (1993).






c++ c macros boolean obfuscation