দ্রুত রিভিশনের জন্য সূত্র, সাধারণ ভুল আর ফ্ল্যাশ কার্ড, এক জায়গায়।
৭টি সূত্র ও নিয়ম
সি ও প্রোগ্রামিং
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] এর বিনিময়যোগ্যতা
C/C++ এ অ্যারের সাবস্ক্রিপ্ট ব্র্যাকেট [] মূলত পয়েন্টার অ্যারিথমেটিকের সিনট্যাকটিক সুগার। কম্পাইলার a[i] কে অভ্যন্তরীণভাবে *(a + i) তে রূপান্তর করে। যোগের বিনিময় নিয়ম (Commutative Law) অনুযায়ী *(a + i) এবং *(i + a) হুবহু একই মেমরি নির্দেশ করে। ফলে C কোডে i[a] লেখা সম্পূর্ণ বৈধ এবং তা a[i] এর মান প্রদান করে।
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 = পরে বাড়াও")
ডাবল কোটেশনে থাকা স্ট্রিং লিটারালের শেষে কম্পাইলার স্বয়ংক্রিয়ভাবে একটি নাল ক্যারেক্টার '\0' যুক্ত করে। sizeof("text") কম্পাইল-টাইম অপারেটর যা মেমরিতে দখলকৃত মোট বাইট (নাল টার্মিনেটরসহ) গণনা করে। অন্যদিকে strlen("text") রান-টাইম লাইব্রেরি ফাংশন যা প্রথম '\0' পাওয়ার পূর্ব পর্যন্ত কেবলমাত্র দৃশ্যমান ক্যারেক্টারের সংখ্যা গুনে দেয়।
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-তে সাধারণ গুণ বা ভাগের চেয়ে বিটওয়াইজ শিফট অনেক দ্রুত কার্যকর হয়।
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)।