মূল কনটেন্টে যান

সূত্র, নিয়ম ও ফ্ল্যাশ কার্ড

দ্রুত রিভিশনের জন্য সূত্র, সাধারণ ভুল আর ফ্ল্যাশ কার্ড, এক জায়গায়।

৭টি সূত্র ও নিয়ম

সি ও প্রোগ্রামিং

C বনাম C++ এ ক্যারেক্টার কনস্ট্যান্টের সাইজ ট্র্যাপ

Character Literal Size Trap: sizeof(char) vs sizeof('a') in C vs C++

সূত্র

In C: sizeof('a') == sizeof(int) (usually 4 bytes). In C++: sizeof('a') == sizeof(char) == 1 byte. Always: sizeof(char) == 1.

নিয়ম ও সহজ উপায়

C ভাষায় ক্যারেক্টার লিটারাল বা কনস্ট্যান্ট যেমন 'a' এর টাইপ মূলত int (ইন্টিজার প্রমোশন নীতি), তাই sizeof('a') দিলে ইন্টিজারের সাইজ (সাধারণত ৩২-বিট আর্কিটেকচারে ৪ বাইট) রিটার্ন করে। পক্ষান্তরে C++ এ 'a' এর টাইপ সরাসরি char, তাই sizeof('a') হবে ১ বাইট। তবে উভয় ভাষাতেই char ভেরিয়েবলের সাইজ char c = 'a'; sizeof(c) সর্বদা ১ বাইট।

সি ও প্রোগ্রামিং

অ্যারে সাবস্ক্রিপ্ট সমতা কৌশল: a[i] ও i[a] এর বিনিময়যোগ্যতা

Array Subscript Equivalence: a[i] == *(a + i) == i[a]

সূত্র

a[i] == *(a + i) == *(i + a) == i[a]

নিয়ম ও সহজ উপায়

C/C++ এ অ্যারের সাবস্ক্রিপ্ট ব্র্যাকেট [] মূলত পয়েন্টার অ্যারিথমেটিকের সিনট্যাকটিক সুগার। কম্পাইলার a[i] কে অভ্যন্তরীণভাবে *(a + i) তে রূপান্তর করে। যোগের বিনিময় নিয়ম (Commutative Law) অনুযায়ী *(a + i) এবং *(i + a) হুবহু একই মেমরি নির্দেশ করে। ফলে C কোডে i[a] লেখা সম্পূর্ণ বৈধ এবং তা a[i] এর মান প্রদান করে।

সি ও প্রোগ্রামিং

প্রি-ইনক্রিমেন্ট (++a) বনাম পোস্ট-ইনক্রিমেন্ট (a++) শর্টকাট

Pre-increment (++a) vs Post-increment (a++) in Expressions

সূত্র

++a: Increment value first, then use in expression. a++: Use current value in expression first, then increment.

নিয়ম ও সহজ উপায়

প্রি-ইনক্রিমেন্ট (++a): ভেরিয়েবলের মান তৎক্ষণাৎ ১ বৃদ্ধি পায় এবং এক্সপ্রেশনে বর্ধিত নতুন মানটি কার্যকর হয়। পোস্ট-ইনক্রিমেন্ট (a++): এক্সপ্রেশনে আগে ভেরিয়েবলের বর্তমান মান ব্যবহৃত হয়, এরপর স্টেটমেন্ট অতিক্রম করার সময় মান ১ বৃদ্ধি পায়। ("Pre = আগে বাড়াও, Post = পরে বাড়াও")

সি ও প্রোগ্রামিং

স্ট্রিং লিটারাল সাইজ ট্র্যাপ: sizeof("CSE") বনাম strlen("CSE")

String Literal Size: sizeof("CSE") vs strlen("CSE")

সূত্র

sizeof("CSE") == strlen("CSE") + 1 == 3 + 1 == 4 bytes (includes '\0'). strlen() counts visible characters only.

নিয়ম ও সহজ উপায়

ডাবল কোটেশনে থাকা স্ট্রিং লিটারালের শেষে কম্পাইলার স্বয়ংক্রিয়ভাবে একটি নাল ক্যারেক্টার '\0' যুক্ত করে। sizeof("text") কম্পাইল-টাইম অপারেটর যা মেমরিতে দখলকৃত মোট বাইট (নাল টার্মিনেটরসহ) গণনা করে। অন্যদিকে strlen("text") রান-টাইম লাইব্রেরি ফাংশন যা প্রথম '\0' পাওয়ার পূর্ব পর্যন্ত কেবলমাত্র দৃশ্যমান ক্যারেক্টারের সংখ্যা গুনে দেয়।

সি ও প্রোগ্রামিং

ডাবল পয়েন্টার (**ptr) ডিরিফারেন্সিং শর্টকাট নিয়ম

Double Pointer (**ptr) Dereferencing Shortcut

সূত্র

ptr = &var (address of var); *ptr = var (value of var). ptr2 = &ptr; *ptr2 = ptr (&var); **ptr2 = var (value of var).

নিয়ম ও সহজ উপায়

পয়েন্টার চেইনে প্রতিটি * (অ্যাস্টেরিস্ক) ডিরিফারেন্স অপারেশনে মেমরির একটি করে স্তর ভেদ করে মূল ভ্যালুর দিকে অগ্রসর হয়: ptr2 নিজে ধারণ করে পয়েন্টারের মেমরি অ্যাড্রেস, *ptr2 প্রকাশ করে মূল ভেরিয়েবলের অ্যাড্রেস, এবং **ptr2 সরাসরি মূল ভেরিয়েবলের মূল ভ্যালুকে প্রকাশ করে। কোনো ফাংশনে পয়েন্টারের মেমরি রেফারেন্স বদলাতে (যেমন dynamic memory allocation) ডাবল পয়েন্টার পাস করতে হয়।

সি ও প্রোগ্রামিং

বিটওয়াইজ শিফট: দ্রুত গুণন ও ভাগের শর্টকাট

Bitwise Shifts: Fast Multiplication and Division Rules

সূত্র

x << k == x * (2^k)  and  x >> k == floor(x / (2^k))

নিয়ম ও সহজ উপায়

ধনাত্মক পূর্ণসংখ্যার ক্ষেত্রে বামে k বিট শিফট (x << k) করা মানে সংখ্যাটিকে 2^k দ্বারা গুণ করা। ডানে k বিট শিফট (x >> k) করা মানে সংখ্যাটিকে 2^k দ্বারা পূর্ণসংখ্যায় ভাগ (Integer / Floor Division) করা। প্রসেসরের ALU-তে সাধারণ গুণ বা ভাগের চেয়ে বিটওয়াইজ শিফট অনেক দ্রুত কার্যকর হয়।

সি ও প্রোগ্রামিং

বিটওয়াইজ টু-এর পাওয়ার চেক: n & (n - 1) == 0 কৌশল

Bitwise Power of 2 Check: (n > 0) && ((n & (n - 1)) == 0)

সূত্র

isPowerOfTwo(n) = (n > 0) && ((n & (n - 1)) == 0)

নিয়ম ও সহজ উপায়

যেকোনো 2^k সংখ্যার বাইনারি উপস্থাপনায় ঠিক একটিমাত্র ১-বিট থাকে (যেমন 8 = 1000₂)। তার ঠিক পূর্ববর্তী সংখ্যা n - 1 এ ওই বিটটি ০ হয়ে তার ডানের সকল বিট ১ হয়ে যায় (যেমন 7 = 0111₂)। এদের মধ্যে বিটওয়াইজ AND করলে ফলাফল শূন্য (0) হয়। যদি (n & (n - 1)) == 0 হয় এবং n > 0 হয়, তবে সংখ্যাটি নিশ্চিতভাবে ২-এর ঘাত (Power of 2)।