আমি একটি কোডিং বইয়ে নিম্নলিখিত ম্যাক্রো সংজ্ঞাগুলি দেখেছি।
#define TRUE '/'/'/'
#define FALSE '-'-'-'
সেখানে কোনও ব্যাখ্যা ছিল না।
দয়া করে আমাকে ব্যাখ্যা কিভাবে এই হিসাবে কাজ করবে TRUE
এবংFALSE
।
আমি একটি কোডিং বইয়ে নিম্নলিখিত ম্যাক্রো সংজ্ঞাগুলি দেখেছি।
#define TRUE '/'/'/'
#define FALSE '-'-'-'
সেখানে কোনও ব্যাখ্যা ছিল না।
দয়া করে আমাকে ব্যাখ্যা কিভাবে এই হিসাবে কাজ করবে TRUE
এবংFALSE
।
উত্তর:
দেখা যাক: '/' / '/'
মানে char
আক্ষরিক /
, দ্বারা বিভক্ত char
আক্ষরিক '/'
নিজেই। ফলাফলটি এক, যা যুক্তিসঙ্গত বলে মনে হয় TRUE
।
এবং আক্ষরিক '-' - '-'
অর্থ নিজের থেকে বিয়োগ করা। এটি শূন্য ( )।char
'-'
FALSE
এটির সাথে দুটি সমস্যা রয়েছে: প্রথমত, এটি পাঠযোগ্য নয়। ব্যবহার করা 1
এবং 0
একেবারে ভাল। এছাড়াও, যেমন তরত্নল্লামা এবং কেরেকএসবি উল্লেখ করেছেন, আপনি যদি কখনও এই সংজ্ঞাটি ব্যবহার করতে যান তবে দয়া করে তাদের চারপাশে প্রথম বন্ধনী যুক্ত করুন যাতে আপনার কোনও অবাক হওয়ার দরকার নেই:
#include <stdio.h>
#define TRUE '/'/'/'
#define FALSE '-'-'-'
int main() {
printf ("%d\n", 2 * FALSE);
return 0;
}
এটি char
আক্ষরিকের মানটি মুদ্রণ করবে'-'
(আমার সিস্টেমে 45)।
বন্ধনী সহ:
#define TRUE ('/'/'/')
#define FALSE ('-'-'-')
প্রোগ্রামটি সঠিকভাবে শূন্য প্রিন্ট করে, যদিও এটি কোনও পূর্ণসংখ্যার দ্বারা সত্যের মানকে গুণতে বেশি অর্থবোধ করে না, তবে এটি কেবলমাত্র অপ্রত্যাশিত বাগগুলির উদাহরণ যা আপনি আপনার ম্যাক্রোসকে প্রথম বন্ধনে আবদ্ধ না করলে আপনাকে দংশন করতে পারে।
if
গুণিত করার পরিবর্তে একটি ব্যবহার করা আরও পরিষ্কার (এবং ধারণামূলকভাবে বোধগম্য) হবে TRUE
।
notx = TRUE- x;
এবং সূক্ষ্মভাবে কাজ করে। TRUE-FALSE
যা -৪৪ (এএসসিআইআই অনুমান করে) বাদে
এটি লেখার আরও একটি উপায়
#define TRUE 1
#define FALSE 0
অভিব্যক্তিটি নিজের দ্বারা '/'/'/'
মানের মানকে ভাগ করবে '/'
, ফলস্বরূপ 1 দেবে give
অভিব্যক্তিটি নিজের থেকে '-'-'-'
চর মানটি বিয়োগ করবে '-'
যা ফলাফল হিসাবে 0 দেবে।
পুরো define
এক্সপ্রেশনগুলির চারপাশে বন্ধনীগুলি অনুপস্থিত রয়েছে, যা এই ম্যাক্রোগুলি ব্যবহার করে কোডে ত্রুটি দেখা দিতে পারে। জয়ের উত্তরজয়ের এটি বেশ ভালভাবে দেখায়।
"রিয়েল-লাইফ" দৃশ্যের উদাহরণ যেখানে বন্ধনীগুলি ভুলে যাওয়া ক্ষতিকারক হতে পারে এটি সি-স্টাইলের কাস্ট অপারেটরের সাথে এই ম্যাক্রোগুলির সম্মিলিত ব্যবহার। যদি কেউ 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
।
এটি লেখার সমতুল্য
#define TRUE 1
#define FALSE 0
এক্সপ্রেশনটি '/'/'/'
আসলে যা করে তা হ'ল চরিত্রটি /
(তার সংখ্যার মান যাই হোক না কেন) ভাগ করে নেওয়া, তাই এটি হয়ে যায় 1
।
একইভাবে, অভিব্যক্তিটি '-'-'-'
চরিত্রটি -
নিজের থেকে বিয়োগ করে এবং মূল্যায়ন করে 0
।
লিখলে ভাল হয়
#define TRUE ('/'/'/')
#define FALSE ('-'-'-')
অন্যান্য উচ্চ-অগ্রাধিকার অপারেটরগুলির সাথে ব্যবহৃত হলে মানগুলির দুর্ঘটনাজনিত পরিবর্তন এড়াতে।
জে ইতিমধ্যে উত্তর দিয়েছিলেন যে কেন এই অভিব্যক্তির মানগুলি হয় 0
এবং 1
।
ইতিহাসের জন্য, এই অভিব্যক্তিগুলি '/'/'/'
এবং ১৯৮৪ সালে প্রথম আন্তর্জাতিক অবরুদ্ধ সি কোড প্রতিযোগিতার'-'-'-'
একটি এন্ট্রি থেকে এসেছে :
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);}
(প্রোগ্রামটি এখানে লিঙ্ক , উপরের আইওসিসি পৃষ্ঠায় এই প্রোগ্রামটি কী করে তার একটি ইঙ্গিত রয়েছে))
এছাড়াও যদি আমি obfuscated ম্যাক্রো এই সঠিকভাবে এক্সপ্রেশন স্মরণ TRUE
এবং FALSE
এছাড়াও মধ্যে আবৃত ছিল "obfuscated সি ও অন্যান্য রহস্য" ডন Libes (1993) দ্বারা বই।
এটি ম্যাক্রোগুলি লেখার জন্য True
এবং এটির জন্য হাস্যকর উপায় False
।
যতগুলি ব্যাখ্যা প্রদান করা হয়েছে তার /
অর্থ একটি 1 বাইট সংখ্যা (এএসসিআইআই অনুসারে) যখন নিজেই ভাগ হয়ে যায় তখন এটি আপনাকে দেয় 1
যা হিসাবে বিবেচিত হবে True
এবং একইভাবে -
আবার একটি বাইট নম্বর হবে যখন এটি আপনাকে দেওয়া একই মানকে বিয়োগ করবে 0
যা হিসাবে ব্যাখ্যা করা হবেfalse
#define TRUE '/'/'/'
#define FALSE '-'-'-'
অতএব আমরা যেকোন চরকে প্রতিস্থাপন করতে পারি /
বা পছন্দ করতে -
পারি, উদাহরণস্বরূপ:
#define TRUE '!'/'!'
#define FALSE 'o'-'o'
আসল অভিব্যক্তির সমান অর্থ রাখবে।
আসুন সত্য দিয়ে শুরু করা যাক। আপনি এটি হিসাবে এটি পড়তে পারেন '/' / '/'
, যার অর্থ "চরিত্র '/' অক্ষর দ্বারা বিভক্ত '/'"। যেহেতু প্রতিটি অক্ষর, সি-তে একটি সংখ্যাসূচক মান হয় (এক বাইটে), এটি "অক্ষরের ASCII মান '/ একই অক্ষরের ASCII মান দ্বারা বিভক্ত" হিসাবে পড়া যায়, যার অর্থ 1 (কারণ, স্পষ্টতই, এক্স / এক্স হয় 1)। সুতরাং, TRUE
হয় 1।
কারণ FALSE
এর একই যুক্তি: '-'-'-'
পাঠ্য '-' - '-'
, অর্থাত "'-' এর ASCII মান '-'" এর বিয়োগফলের ASCII মান, যা FALSE
0 হয়। সুতরাং, 0 হয় is
এটি সুস্পষ্টভাবে বর্ণনা করার একটি বাজে উপায়।
'/'/'/'
জন্য 1 কোন বৈধ অক্ষর সেট কিনা '/' == 47
(এটা হওয়া ASCII হয় যেমন), অথবা '/' == 97
(যেমন EBCDIC হয়), বা অন্য কোন মান।
'/'
করতে পারে না 0
। সেই মানটি নাল চরিত্রের জন্য সংরক্ষিত।