সত্য এবং মিথ্যা ম্যাক্রোর অদ্ভুত সংজ্ঞা


299

আমি একটি কোডিং বইয়ে নিম্নলিখিত ম্যাক্রো সংজ্ঞাগুলি দেখেছি।

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

সেখানে কোনও ব্যাখ্যা ছিল না।

দয়া করে আমাকে ব্যাখ্যা কিভাবে এই হিসাবে কাজ করবে TRUEএবংFALSE


63
আমি মনে করি এটি সত্য হিসাবে 1 এবং মিথ্যা 0 হিসাবে সংজ্ঞায়িত করার জন্য একটি মজার উপায়
ব্ল্যাকওয়ার্ড

160
মনে রাখবেন যে এই প্রকাশগুলির চারপাশে বন্ধনী ছাড়াই এটি একটি ভয়ানক ধারণা। আমি বলতে চাচ্ছি এটা একটি ভয়ানক ধারণা সঙ্গে তাদের, কিন্তু আপনি শুধু ডিবাগিং একটি দীর্ঘ রাতের জন্য বলছি না।
তরত্নল্লামা

70
আপনি যে কোডিং বইটি উল্লেখ করছেন তা কি জানতে পারি?
আর্টেম

47
আমি আশা করি যে বইটি এটি খারাপ বা ইচ্ছাকৃতভাবে অস্পষ্ট কোডের উদাহরণ হিসাবে অন্তর্ভুক্ত করেছে।
জন হানা 10

31
@ ড্যানিয়েল: আরেকটি ধারণা হ'ল ()% 2 র্যান্ড ()% 2 কে MAYBE হিসাবে সংজ্ঞায়িত করা, যাতে এটি কখনও কখনও == সত্য এবং কখনও কখনও == মিথ্যা।
কাইসরুদ্দি

উত্তর:


380

দেখা যাক: '/' / '/'মানে 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 ('-'-'-')

প্রোগ্রামটি সঠিকভাবে শূন্য প্রিন্ট করে, যদিও এটি কোনও পূর্ণসংখ্যার দ্বারা সত্যের মানকে গুণতে বেশি অর্থবোধ করে না, তবে এটি কেবলমাত্র অপ্রত্যাশিত বাগগুলির উদাহরণ যা আপনি আপনার ম্যাক্রোসকে প্রথম বন্ধনে আবদ্ধ না করলে আপনাকে দংশন করতে পারে।


6
ড্যাম আমি এটি বুঝতে অনেকটা নিলাম: s এমনকি এটি
গ্লাইফ হিসাবে আশ্চর্যজনক

8
সত্যিকারের মানটির সাথে এটি গুণমানটি বোধগম্য হয়। পরীক্ষার্থী ইন্ডেন্টেশনের জন্য * should_indent এর শাখা ছাড়াই should_indent কিনা তার উপর ভিত্তি করে 0 বা ইনডেন্টেশন হবে। (আমি অনুমান করি যে এটি খারাপ উদাহরণ, যখন পাঠ্য একক শাখাগুলির সাথে কাজ করা কোনও ব্যাপার না, (আমি এই কৌশলটি শেডারগুলিতে এবং
এক্সপিএইচটিতে দেখলাম

2
আলপেদার - তবে এটি ধারণাগতভাবে এবং মাতৃমতে সেনসোকে এটি করার জন্য তৈরি করে না - এক্ষেত্রে এটি পূর্ণসংখ্যা দ্বারা ifগুণিত করার পরিবর্তে একটি ব্যবহার করা আরও পরিষ্কার (এবং ধারণামূলকভাবে বোধগম্য) হবে TRUE
জে

4
দুর্দান্ত ব্যাখ্যা। একটি সোনার ব্যাজ আছে!
মাইকেল হ্যাম্পটন 17

2
যৌক্তিক অবহেলা কার্যকর করা যেতে পারে notx = TRUE- x;এবং সূক্ষ্মভাবে কাজ করে। TRUE-FALSEযা -৪৪ (এএসসিআইআই অনুমান করে) বাদে
হেইগেন ভন ইটসেন

89

এটি লেখার আরও একটি উপায়

#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


4
উদাহরণটি একটি দুর্দান্ত :)
কিট ফিস্টো

44

এটি লেখার সমতুল্য

#define TRUE 1
#define FALSE 0

এক্সপ্রেশনটি '/'/'/'আসলে যা করে তা হ'ল চরিত্রটি /(তার সংখ্যার মান যাই হোক না কেন) ভাগ করে নেওয়া, তাই এটি হয়ে যায় 1

একইভাবে, অভিব্যক্তিটি '-'-'-'চরিত্রটি -নিজের থেকে বিয়োগ করে এবং মূল্যায়ন করে 0

লিখলে ভাল হয়

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

অন্যান্য উচ্চ-অগ্রাধিকার অপারেটরগুলির সাথে ব্যবহৃত হলে মানগুলির দুর্ঘটনাজনিত পরিবর্তন এড়াতে।


5
হাঃ হাঃ হাঃ! এজন্য ম্যাক্রোগুলিকে যথাযথভাবে প্রথম বন্ধনী করা উচিত।
0605002

একটি গোলকের 3 টি অধিকার এবং আপনি একই জায়গায় সমাপ্ত হন
ডেরেক 會 功夫 功夫

@KerrekSB না, কিন্তু তিনটি বামপন্থী না :)
টিম লং

33

জে ইতিমধ্যে উত্তর দিয়েছিলেন যে কেন এই অভিব্যক্তির মানগুলি হয় 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) দ্বারা বই।


7

এটি ম্যাক্রোগুলি লেখার জন্য Trueএবং এটির জন্য হাস্যকর উপায় False

যতগুলি ব্যাখ্যা প্রদান করা হয়েছে তার /অর্থ একটি 1 বাইট সংখ্যা (এএসসিআইআই অনুসারে) যখন নিজেই ভাগ হয়ে যায় তখন এটি আপনাকে দেয় 1যা হিসাবে বিবেচিত হবে Trueএবং একইভাবে -আবার একটি বাইট নম্বর হবে যখন এটি আপনাকে দেওয়া একই মানকে বিয়োগ করবে 0যা হিসাবে ব্যাখ্যা করা হবেfalse

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

অতএব আমরা যেকোন চরকে প্রতিস্থাপন করতে পারি /বা পছন্দ করতে -পারি, উদাহরণস্বরূপ:

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

আসল অভিব্যক্তির সমান অর্থ রাখবে।


6

আসুন সত্য দিয়ে শুরু করা যাক। আপনি এটি হিসাবে এটি পড়তে পারেন '/' / '/', যার অর্থ "চরিত্র '/' অক্ষর দ্বারা বিভক্ত '/'"। যেহেতু প্রতিটি অক্ষর, সি-তে একটি সংখ্যাসূচক মান হয় (এক বাইটে), এটি "অক্ষরের ASCII মান '/ একই অক্ষরের ASCII মান দ্বারা বিভক্ত" হিসাবে পড়া যায়, যার অর্থ 1 (কারণ, স্পষ্টতই, এক্স / এক্স হয় 1)। সুতরাং, TRUEহয় 1।

কারণ FALSEএর একই যুক্তি: '-'-'-'পাঠ্য '-' - '-', অর্থাত "'-' এর ASCII মান '-'" এর বিয়োগফলের ASCII মান, যা FALSE0 হয়। সুতরাং, 0 হয় is

এটি সুস্পষ্টভাবে বর্ণনা করার একটি বাজে উপায়।


7
এএসসিআইআইয়ের সাথে এর কোনও যোগসূত্র নেই।
কেরেক এসবি

6
@ ফ্যাবিয়েন: এটি ASCII এর উপর নির্ভর করে না । '/'/'/'জন্য 1 কোন বৈধ অক্ষর সেট কিনা '/' == 47(এটা হওয়া ASCII হয় যেমন), অথবা '/' == 97(যেমন EBCDIC হয়), বা অন্য কোন মান।
কিথ থম্পসন

4
@ পাওয়েল: একটি রূপান্তরকারী সি বাস্তবায়ন মানচিত্র '/'করতে পারে না 0। সেই মানটি নাল চরিত্রের জন্য সংরক্ষিত।
কিথ থম্পসন

2
আপনি পেডেন্টিক হচ্ছে।
ম্যাথিউস208

3
@ ম্যাথিউস208 যদি পাভেল প্যাডেন্টিক ছিলেন, তবে এটি ('-'-'-') যেহেতু তাঁর বক্তব্যটি একটি অস্থিতিশীল অবস্থার উপর ভিত্তি করে ছিল; কীথের মন্তব্যকে পেডেন্টিক হিসাবে বর্ণনা করা আরও বেশি ('/' / '/') হতে পারে তবে আমি তাদের "স্পষ্টকরণ" বলি (এবং যুক্ত স্মাইলিগুলির সাথে "পেডেন্টিক" অবশ্যই আমার কাছে '/' - '/' বলে মনে হয়)। এটি ('-' / '-') হতে পারে যে একসাথে নেওয়া মন্তব্যগুলিকে পেডেন্টিক বলা যেতে পারে তবে, 1) এই ক্ষেত্রে কি কিছুটা বাধ্যতামূলক নয়? 2) তারা আমাকে ভাবিয়ে তোলে; এবং 3) আমি আমার চেয়ে কিছু বিষয়ে কিছুটা পরিষ্কার হয়েছি। এবং হ্যাঁ, আমি অনুমান করি আমি নিজে পেডেন্টিক হচ্ছি! (তবে আমি "পেডেন্টিক" এর অর্থ আমার চেয়ে কী পরিষ্কার ছিলাম! ;-)
ঝোড়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.