کدلپر - مرجع جامع آموزش برنامه‌نویسی

All Right Reserved © 2025 Codoloper

background codoloper

عملگرهای مقایسه ای و منطقی Relational and Logical Operators

خانه

عملگرهای مقایسه‌ای (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 بالا باشه،
اما بدون استفاده از && یا ||.