عملگرهای مقایسهای (Relational) در C اینا هستن
> , >= , < , <=
همهی این عملگرها درجهی تقدم (precedence) یکسانی دارن.
درست پایینتر از اونها از نظر تقدم، عملگرهای برابری (equality) قرار میگیرن:
== و !=
عملگرهای مقایسهای از نظر تقدم پایینتر از عملگرهای حسابی هستن،
پس عبارتی مثل:
i < lim - 1
بهصورت i < (lim - 1) تفسیر میشه — دقیقاً همون چیزی که انتظارش رو داریم
حالا بریم سراغ عملگرهای منطقی جالبتر یعنی:
&& (و یا AND منطقی) و || (یا OR منطقی).
عبارتهایی که با && یا || به هم وصل میشن، از چپ به راست ارزیابی میشن،
و همینکه نتیجهی کلی مشخص بشه، ادامهی ارزیابی متوقف میشه (به این رفتار میگن short-circuit evaluation).
بیشتر برنامههای C دقیقاً از همین ویژگی استفاده میکنن.
مثلاً این تکهکد از تابع ورودی getline که توی فصل ۱ نوشتیم:
for (i = 0; i < lim - 1 && (c = getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
قبل از اینکه یه کاراکتر جدید بخونیم، باید مطمئن بشیم هنوز توی آرایه s جا داریم،
برای همین شرط i < lim - 1 باید اول بررسی بشه.
اگه این شرط برقرار نباشه، نباید بریم سراغ خوندن کاراکتر بعدی.
به همین شکل، نباید c رو با EOF مقایسه کنیم قبل از اینکه getchar() صدا زده بشه —
پس اول باید مقداردهی انجام بشه، بعد مقایسه با '\n'.
درجهی تقدم && بالاتر از || هست،
و هر دوی اینها از عملگرهای مقایسهای و برابری پایینتر هستن.
به همین دلیل، توی عبارتی مثل:
i < lim - 1 && (c = getchar()) != '\n' && c != EOF
دیگه نیازی به پرانتز اضافی نداریم.
ولی چون تقدم != از عملگر انتساب (=) بالاتره،
برای گرفتن نتیجهی درست باید پرانتز رو در (c = getchar()) != '\n' بنویسیم،
تا اول مقدار به c داده بشه و بعد مقایسه انجام بشه.
بهصورت تعریفشده، مقدار عددی یه عبارت منطقی یا مقایسهای ۱ هست اگه شرط برقرار باشه (true)،
و ۰ اگه برقرار نباشه (false).
عملگر منفی یگانی ! (logical NOT) هم یه عملوند غیر صفر رو به صفر تبدیل میکنه
و یه عملوند صفر رو به ۱.
یه کاربرد رایج ! اینه که بهجای نوشتن:
if (valid == 0)
بنویسیم:
if (!valid)
انتخاب بین این دو فرم بیشتر به سلیقه و خوانایی کد برمیگرده.
عبارتهایی مثل !valid خیلی طبیعی خونده میشن (مثل «اگر معتبر نیست»)،
ولی توی شرطهای پیچیدهتر ممکنه خوندنشون سختتر بشه.
تمرین ۲-۲:
یه حلقه بنویس که معادل حلقهی for بالا باشه،
اما بدون استفاده از && یا ||.