👑 قوانین نانوشته #C :
وقتی عبارتی مثل 1 + 2 * 3 رو مینویسید، #C از کجا میدونه که اول باید ضرب رو انجام بده؟ یا چرا 8 / 4 / 2 میشه 1 و نه 4؟
جواب تو دو تا قانون کلیدیه که امروز یاد میگیریم:
●اولویت (Precedence)
●ترتیب اجرا (Associativity).
اول از همه، بدونید که خودِ انتساب (=) در #C یک "عبارت" هست و مقدار داره! مقدارش هم همون چیزیه که بهش اختصاص داده شده. این ویژگی به ما اجازه میده کدهای جالبی بنویسیم:
زنجیرهای کردن انتساب: برای مقداردهی اولیه چند متغیر:
عملگرهای ترکیبی: اینها میانبرهای syntactic برای ترکیب انتساب با یه عملگر دیگهان و کد رو تمیزتر میکنن:
مثل ریاضی مدرسه، بعضی عملگرها در #C "زورشان" بیشتره. کامپایلر همیشه اول سراغ عملگرهای با اولویت بالاتر میره.
اولویت * و / از + و - بیشتره.
به همین دلیله که عبارت زیر، اینجوری محاسبه میشه:
3️⃣ترتیب اجرا (Associativity): چپ به راست یا راست به چپ؟
حالا اگه اولویتها یکی بود چی؟ اینجا "ترتیب اجرا" وارد میشه.
چپ-به-راست (Left-associative):
بیشتر عملگرهای دوتایی در #C چپ-به-راست هستن. یعنی محاسبه از چپ شروع میشه.
راست-به-چپ (Right-associative):
اما عملگرهای انتساب (=)، شرطی سهتایی (?:) و null-coalescing (??) استثنا هستن و از راست به چپ ارزیابی میشن.
این ویژگی به ما اجازه میده که انتساب زنجیرهای داشته باشیم:
تسلط بر این قوانین، شما رو از خیلی از باگهای محاسباتی نجات میده و بهتون کمک میکنه کد بقیه رو سریعتر بخونید.
آیا تا حالا باگی داشتید که به خاطر رعایت نکردن اولویت عملگرها به وجود اومده باشه؟ یا از قابلیت زنجیرهای کردن انتساب (a=b=c) استفاده میکنید؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[C# Geeks Hangout]
اولویت و ترتیب اجرای عملگرها
وقتی عبارتی مثل 1 + 2 * 3 رو مینویسید، #C از کجا میدونه که اول باید ضرب رو انجام بده؟ یا چرا 8 / 4 / 2 میشه 1 و نه 4؟
جواب تو دو تا قانون کلیدیه که امروز یاد میگیریم:
●اولویت (Precedence)
●ترتیب اجرا (Associativity).
1️⃣عبارتهای انتساب (=) و ترفندهاش ✍️
اول از همه، بدونید که خودِ انتساب (=) در #C یک "عبارت" هست و مقدار داره! مقدارش هم همون چیزیه که بهش اختصاص داده شده. این ویژگی به ما اجازه میده کدهای جالبی بنویسیم:
زنجیرهای کردن انتساب: برای مقداردهی اولیه چند متغیر:
int a, b, c;
a = b = c = 0; // هر سه متغیر برابر با صفر میشن
عملگرهای ترکیبی: اینها میانبرهای syntactic برای ترکیب انتساب با یه عملگر دیگهان و کد رو تمیزتر میکنن:
int x = 5;
x *= 2; // معادل: x = x * 2; حالا x برابر 10 است
2️⃣اولویت عملگرها (Precedence): چه کسی رئیس است؟
مثل ریاضی مدرسه، بعضی عملگرها در #C "زورشان" بیشتره. کامپایلر همیشه اول سراغ عملگرهای با اولویت بالاتر میره.
اولویت * و / از + و - بیشتره.
به همین دلیله که عبارت زیر، اینجوری محاسبه میشه:
// کامپایلر این رو به صورت 1 + (2 * 3) میبینه
int result = 1 + 2 * 3; // خروجی: 7
3️⃣ترتیب اجرا (Associativity): چپ به راست یا راست به چپ؟
حالا اگه اولویتها یکی بود چی؟ اینجا "ترتیب اجرا" وارد میشه.
چپ-به-راست (Left-associative):
بیشتر عملگرهای دوتایی در #C چپ-به-راست هستن. یعنی محاسبه از چپ شروع میشه.
// کامپایلر این رو به صورت (8 / 4) / 2 میبینه
int result = 8 / 4 / 2; // خروجی: 1
راست-به-چپ (Right-associative):
اما عملگرهای انتساب (=)، شرطی سهتایی (?:) و null-coalescing (??) استثنا هستن و از راست به چپ ارزیابی میشن.
این ویژگی به ما اجازه میده که انتساب زنجیرهای داشته باشیم:
int x, y;
// کامپایلر این رو به صورت (x = (y = 3)) میبینه
// اول 3 در y ریخته میشه، و بعد حاصل اون عبارت (که 3 هست) در x ریخته میشه.
x = y = 3;
🤔 حرف حساب و تجربه شما
تسلط بر این قوانین، شما رو از خیلی از باگهای محاسباتی نجات میده و بهتون کمک میکنه کد بقیه رو سریعتر بخونید.
آیا تا حالا باگی داشتید که به خاطر رعایت نکردن اولویت عملگرها به وجود اومده باشه؟ یا از قابلیت زنجیرهای کردن انتساب (a=b=c) استفاده میکنید؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[C# Geeks Hangout]
🔖 هشتگها:
#CSharp #Programming #Developer #DotNet #CodingTips #Fundamentals #Operators