عملگرهای منطقی عملیات حسابی
اخرین بروزرسانی: 30.10.2018
بیشتر عملیات در جاوا مشابه عملیاتی است که در سایر زبان های مشابه C استفاده می شود. عملیات تکی (که روی یک عملوند انجام می شود)، عملیات باینری روی دو عملوند و عملیات سه تایی روی سه عملوند وجود دارد. عملوند یک متغیر یا مقدار (مثلاً یک عدد) است که در یک عملیات شرکت می کند. انواع عملیات را در نظر بگیرید.
عملیات حسابی شامل اعداد است. جاوا دارای عملیات حسابی باینری (که روی دو عملوند انجام می شود) و عملیات حسابی تک واحدی (که روی یک عملوند انجام می شود) دارد. عملیات باینری شامل موارد زیر است:
عملیات جمع دو عدد:
int a = 10; int b = 7; int c = a + b; // 17 int d = 4 + b; // یازده
عملیات تفریق دو عدد:
int a = 10; int b = 7; int c = a - b; // 3 int d = 4 - a; // -6
عملیات ضرب دو عدد
int a = 10; int b = 7; int c = a*b; // 70 int d = b * 5; // 35
عمل تقسیم دو عدد:
int a = 20; int b = 5; int c = a / b; // 4 دو برابر d = 22.5 / 4.5; // 5.0
هنگام تقسیم، ارزش توجه دارد، زیرا اگر دو عدد صحیح در این عملیات دخالت داشته باشند، نتیجه تقسیم به یک عدد صحیح گرد می شود، حتی اگر نتیجه به یک متغیر شناور یا دوگانه اختصاص داده شود:
دو k = 10 / 4; // 2 System.out.println(k);
برای اینکه نتیجه یک عدد ممیز شناور باشد، یکی از عملوندها نیز باید یک عدد ممیز شناور باشد:
دو k = 10.0 / 4; // 2.5 System.out.println(k);
بدست آوردن مابقی پس از تقسیم دو عدد:
int a = 33; int b = 5; int c = a % b; // 3 int d = 22% 4; // 2 (22 - 4*5 = 2)
همچنین دو عمل حسابی واحد وجود دارد که بر روی یک عدد انجام می شود: ++ (افزایش) و -- (کاهش). هر یک از عملیات دارای دو نوع است: پیشوند و پسوند:
++ (افزایش پیشوند)
فرض می کنیم که متغیر یک افزایش می یابد، به عنوان مثال z=++y (ابتدا مقدار متغیر y با 1 افزایش می یابد و سپس مقدار آن به متغیر z نسبت داده می شود).
Int a = 8; intb = ++a; System.out.println(a); // 9 System.out.println(b); // 9
++ (افزایش پسوند)
همچنین نشان دهنده افزایش یک متغیر در یک متغیر است، برای مثال z=y++ (ابتدا مقدار y به z اختصاص داده می شود و سپس مقدار y با 1 افزایش می یابد).
Int a = 8; intb = a++; System.out.println(a); // 9 System.out.println(b); // 8
-- (کاهش پیشوند)
متغیر را یک بار کاهش دهید، به عنوان مثال z=--y (ابتدا مقدار متغیر y 1 کاهش می یابد و سپس مقدار آن به متغیر z اختصاص می یابد)
Int a = 8; int b = --a; System.out.println(a); // 7 System.out.println(b); // 7
-- (کاهش پسوند)
z=y-- (ابتدا y به z اختصاص داده می شود، سپس y با 1 کاهش می یابد)
Int a = 8; int b = a--; System.out.println(a); // 7 System.out.println(b); // 8
اولویت عملیات حسابی
برخی از عملیات ها اولویت بیشتری نسبت به سایرین دارند و بنابراین ابتدا اجرا می شوند. عملیات به ترتیب اولویت نزولی:
++ (افزایش)، -- (کاهش)
* (ضرب)، / (تقسیم)، % (باقیمانده تقسیم)
+ (جمع)، - (تفریق)
اولویت عملیات باید هنگام اجرای مجموعه ای از عبارات حسابی در نظر گرفته شود:
Int a = 8; int b = 7; int c = a + 5 * ++b; System.out.println(c); // 48
عملیات افزایشی ++b که اولویت بیشتری دارد، ابتدا انجام می شود - مقدار متغیر b را افزایش می دهد و آن را به عنوان نتیجه برمی گرداند. سپس ضرب 5 * ++b انجام می شود و آخرین آن جمع a + 5 * ++b است
پرانتز به شما امکان می دهد ترتیب ارزیابی را دوباره تعریف کنید:
Int a = 8; int b = 7; int c = (a + 5) * ++b; System.out.println(c); // 104
علیرغم اینکه عملیات جمع اولویت کمتری دارد، ابتدا جمع انجام می شود و نه ضرب، زیرا عمل جمع در داخل پرانتز قرار می گیرد.
انجمنی بودن عملیات
علاوه بر اولویت، عملیات در چنین مفهومی متفاوت است انجمنی. هنگامی که عملیات دارای اولویت یکسانی هستند، ترتیب ارزیابی با مشارکت اپراتورها تعیین می شود. بسته به ارتباط، دو نوع عملگر وجود دارد:
عملگرهای انجمنی چپ که از چپ به راست اجرا می شوند
عملگرهای ارتباطی راست که از راست به چپ اجرا می شوند
به عنوان مثال، برخی از عملیات مانند ضرب و تقسیم دارای تقدم یکسان هستند. در این صورت نتیجه در عبارت چه خواهد بود:
int x = 10 / 5 * 2;
آیا باید این عبارت را به صورت (10 / 5) * 2 یا 10 / (5 * 2) تفسیر کنیم؟ پس از همه، بسته به تفسیر، نتایج متفاوتی می گیریم.
از آنجایی که همه عملگرهای حسابی (به جز افزایش و کاهش پیشوند) به صورت چپ وابسته هستند، یعنی از چپ به راست اجرا می شوند. بنابراین، عبارت 10 / 5 * 2 باید به صورت (10 / 5) * 2 تفسیر شود، یعنی نتیجه 4 خواهد بود.
عملیات با اعداد ممیز شناور
لازم به ذکر است که اعداد ممیز شناور برای محاسبات مالی و سایر محاسبات مناسب نیستند، جایی که خطاهای گرد کردن می توانند حیاتی باشند. مثلا:
دو برابر d = 2.0 - 1.1; System.out.println(d);
که در این موردهمانطور که در ابتدا ممکن است فرض شود، متغیر d برابر 0.9 نخواهد بود، بلکه 0.8999999999999999 خواهد بود. این خطاهای دقت به این دلیل رخ می دهد که اعداد ممیز شناور در سطح پایینی در باینری نشان داده می شوند، اما هیچ نمایش باینری برای 0.1 و همچنین برای مقادیر کسری دیگر وجود ندارد. بنابراین، اگر در چنین مواردی معمولاً از کلاس BigDecimal استفاده می شود که به شما امکان می دهد چنین موقعیت هایی را دور بزنید.
اکثر عملیات در انواع ابتداییبا روش انجام نمی شود، بلکه با شخصیت های خاصتماس گرفت علامت عملیات.
عملیات واگذاری
وظیفه متغیر ارزشثابت، متغیر یا عبارت دیگری (متغیرها و/یا ثابت هایی که با علائم عملگر جدا شده اند) فراخوانی می شود عملیات واگذاریو با علامت " = "، به عنوان مثال: x = 3 ; y = x; z = x؛ در جاوا، می توان از عملگر انتساب چندین بار در یک عبارت استفاده کرد، به عنوان مثال: x1 = x2 = x3 = 0 ؛ این عملیات از از راست به چپ، یعنی ابتدا به متغیر x3 مقدار 0 اختصاص داده می شود، سپس به x2 مقدار x3 (0) و در نهایت به x1 به مقدار x2 اختصاص می یابد (0) علائم عملیاتی که آرگومان های آنها اعداد هستند به دو دسته تقسیم می شوند. : یگانه(یونری) علائم عملیات با یک آرگومان و دودویی(دودویی) با دو آرگومان.عملیات Unary
جاوا عملیات Unary زیر را تعریف می کند:- unary minus "-" - علامت یک عدد یا عبارت را به مخالف تغییر می دهد.
- unary plus " + " - هیچ عملیاتی را روی یک عدد یا عبارت انجام نمی دهد.
- مکمل بیتی "~" (فقط برای اعداد صحیح) - همه بیت های فیلد عدد را معکوس می کند (0 به 1 و 1 به 0 تغییر می کند).
- افزایش "++" (فقط برای اعداد صحیح) - مقدار متغیر را 1 افزایش می دهد.
- کاهش "-" (فقط برای اعداد صحیح) - مقدار متغیر را 1 کاهش می دهد.
عملیات باینری حسابی
جاوا موارد زیر را تعریف می کند عملیات باینری حسابی:- اضافه کردن "+"؛
- منها کردن "-"؛
- ضرب " * "؛
- تقسیم "/"؛
- محاسبه باقیمانده تقسیم اعداد صحیح " % " (باقی مانده تقسیم عدد اول بر دوم را برمی گرداند و نتیجه همان علامت سود سهام خواهد بود) ، به عنوان مثال ، نتیجه عملیات 5٪ 3 می شود 2 و نتیجه عملیات (-7) %(-4) برابر با -3 خواهد بود. در جاوا، این عملیات برای متغیرهای واقعی (از نوع float یا double) نیز قابل استفاده است.
عملیات بیتی
- عملیات بیتی مقادیر عددی اصلی را به عنوان فیلدهای بیت در نظر گرفته و عملیات زیر را بر روی آنها انجام می دهد:
- تنظیم ضربان به منموقعیت -امین فیلد نتیجه 1 است اگر هر دو بیت داخل باشند من-ام موقعیت عملوندها برابر با 1 یا 0 در غیر این صورت بیتی و (" & ") است.
- تنظیم ضربان به منموقعیت -امین فیلد نتیجه 1 است اگر حداقل یک بیت در آن باشد منموقعیت -امین عملوندها 1 یا 0 است در غیر این صورت - به صورت بیتی OR (" | ");
- تنظیم ضربان به منموقعیت -امین فیلد نتیجه 1 است اگر بیت ها وارد شوند منموقعیت های -امین عملوندها با یکدیگر برابر نیستند، یا با 0 در غیر این صورت - انحصاری بیتی OR (" ^ ");
- با تعداد بیت هایی که توسط عملوند دوم تعیین می شود به سمت چپ بیت های فیلد عملوند اول تغییر دهید (بیت علامت عدد در این مورد تغییر نمی کند) - با در نظر گرفتن علامت "به سمت چپ حرکت کنید.<< ";
- جابجایی به سمت راست بیت های فیلد عملوند اول با تعداد بیت های تعیین شده توسط عملوند دوم (بیت علامت عدد در این مورد تغییر نمی کند) - با در نظر گرفتن علامت به سمت راست حرکت کنید. " >>"؛
- شیفت به سمت راست بیت های فیلد عملوند اول با تعداد بیت هایی که توسط عملوند دوم تعیین می شود (بیت علامت عدد نیز در این مورد جابه جا می شود) - به صورت بیتی بدون در نظر گرفتن ">> به سمت راست تغییر می کند. >" علامت بزنید.
به صورت بیتی و
int x = 112 ; int y = 94 ; intz; z=x & y; // z=80: 00000000 00000000 00000000 01010000بیتی OR
int x = 112 ; // x: 00000000 00000000 00000000 01110000 int y = 94 ; // سال: 00000000 00000000 00000000 01011110 intz; z=x | y; // z = 126: 00000000 00000000 00000000 01111110XOR بیتی
int x = 112 ; // x: 00000000 00000000 00000000 01110000 int y = 94 ; // سال: 00000000 00000000 00000000 01011110 intz; z=x^y; // z = 46: 00000000 00000000 00000000 00101110شیفت چپ با علامت
int x = 31 , z; // x: 00000000 00000000 00000000 00011111 z=x<< 2 ; // z = 124: 00000000 00000000 00000000 01111100شیفت به راست با علامت
int x = - 17 , z; z = x >> 2 ; // z = -5: 11111111 11111111 11111111 11111011بدون علامت به راست تغییر دهید
int x = - 17 , z; // x: 11111111 11111111 11111111 11101111 z = x >>> 2 ; // z = 1073741819 // z: 00111111 11111111 11111111 11111011
عملیات ترکیبی
در جاوا برای عملیات حسابی باینری می توانید استفاده کنید ترکیب شدهعلائم عملیات (ترکیب): شناسه عملیات = عبارت این معادل عملیات زیر است: شناسه = عبارت شناسه عملیات مثالها:- عبارت x += b به معنای x = x + b است.
- عبارت x -= b به معنای x = x - b است.
- عبارت x *= b به معنای x = x * b است.
- عبارت x /= b به معنای x = x / b است.
- عبارت x %= b به معنای x = x % b است.
- عبارت x &= b به معنای x = x & b است.
- عبارت x |= b به معنای x = x | ب
- عبارت x ^= b به معنای x = x ^ b است.
- بیان x<<= b означает x = x << b .
- عبارت x >>= b به معنای x = x >> b است.
- عبارت x >>>= b به معنای x = x >>> b است.
عملیات مقایسه
جاوا عملگرهای مقایسه زیر را تعریف می کند:- " == " (برابر)، " != " (برابر نیست)،
- " > " (بزرگتر از)، " >= " (بزرگتر یا مساوی)،
- " < " (меньше) " <= " (меньше или равно)
عملیات بولی
عملیات بولیبر روی متغیرهای بولی انجام می شود و نتیجه آنها نیز مقداری از نوع است بولی. جاوا عملیات بولی زیر را تعریف می کند:- نفی "!" – جایگزینی false با true یا بالعکس
- عملگر AND "&" - نتیجه فقط در صورتی درست است که هر دو عملوند درست باشند، در غیر این صورت نتیجه نادرست است.
- OR عملیات "|" - نتیجه فقط در صورتی درست است که حداقل یکی از عملوندها درست باشد، در غیر این صورت نتیجه نادرست است.
- عملگر XOR "^" - نتیجه فقط در صورتی درست است که عملوندها با یکدیگر برابر نباشند، در غیر این صورت نتیجه نادرست است.
عملیات مشروط
عملگر شرطی به شکل express-1?expression-2:expression-3 نوشته شده است. این ابتدا عبارت-1 را ارزیابی می کند، که باید یک مقدار بولی ایجاد کند، و سپس، اگر عبارت-1 درست باشد، عبارت-2 را به عنوان نتیجه عملیات ارزیابی و برمی گرداند، یا (اگر عبارت-1 به نادرست ارزیابی شود)، ارزیابی می کند و ، عبارت-3 به عنوان نتیجه عملیات برگردانده می شود. نمونه ای از عملیات مشروط: x= n> 1 ? 0:1; متغیر x اگر n>1 باشد، مقدار 0 به آن اختصاص داده می شود (عبارت n>1 به درستی ارزیابی می شود) یا 1 اگر n≤1 (عبارت n>1 به نادرست ارزیابی می شود).تقدم عملیات
عملیات در عبارات از چپ به راست انجام می شود، اما با توجه به اولویت آنها. بنابراین عملیات ضرب در عبارت y = x + z* 5 ; قبل از عمل جمع اجرا خواهد شد زیرا عملیات ضرب اولویت بیشتری نسبت به عملیات جمع دارد. اولویت های عملیات (به ترتیب کاهش اولویت) در جاوا در جدول آورده شده است. 1.پرانتزها اولویت عملیاتی را که در داخل آنها قرار دارد افزایش می دهد. بنابراین، اگر براکت ها را در عبارت بالا وارد کنید: y = (x + z) * 5 ; سپس ابتدا عملیات جمع و سپس عملیات ضرب انجام می شود. گاهی اوقات از پرانتز برای خوانایی بیشتر یک عبارت استفاده می شود، به عنوان مثال: (x > 1 ) && (x<= 5 ) ;
تبدیل نوع و ریخته گری هنگام انجام عملیات
عملیات انتساب و عبارات حسابی می توانند از لفظ، متغیرها و عبارات انواع مختلف استفاده کنند، به عنوان مثال: double y; بایت y = x + 5 ; این مثال متغیر بایت x و لفظی 5 (نوع int) را اضافه می کند و نتیجه را به متغیر دوتایی y اختصاص می دهد. در جاوا، مانند زبان C، تبدیل نوع در ارزیابی عبارات می تواند به طور خودکار یا با کمک یک عملگر نوع ریخته گری انجام شود. با این حال، قوانین ریخته گری تا حدودی با قوانین C متفاوت است و به طور کلی محدودتر از C است. هنگام انجام یک عملیات انتساب، تبدیل نوع به طور خودکار اتفاق می افتد اگر تحول گسترده(تبدیل گسترده) و دو نوع سازگار هستند. دگرگونیهای گستردهتر، تبدیلها هستند بایت® کوتاه® بین المللی® طولانی® شناور® دو برابر. برای گسترش تبدیل، انواع عددی، از جمله عدد صحیح و ممیز شناور، با یکدیگر سازگار هستند. با این حال، انواع عددی با انواع char و boolean سازگار نیستند. نوع char و boolean نیز با یکدیگر سازگار نیستند. زبان جاوا همچنین هنگام ذخیره یک ثابت عدد صحیح واقعی (که به طور پیشفرض دارای نوع int است) در متغیرهای نوع بایت، کوتاه یا طولانی، تبدیل نوع خودکار را انجام میدهد (اما اگر حرف مقداری خارج از محدوده مقادیر معتبر برای در این نوع، یک پیغام خطا ارسال می شود: احتمال از دست دادن دقت). اگر تبدیل در حال باریک شدن باشد (تبدیل باریک)، یعنی تبدیل بایت ¬ کوتاه ¬ کاراکتر ¬ طول ¬ شناور ¬ دو برابر باشد، آنگاه چنین تبدیلی ممکن است منجر به از دست دادن دقت عدد یا تحریف آن شود. بنابراین، تبدیلهای باریک هنگام کامپایل شدن برنامه، یک تشخیص ناسازگاری نوع ایجاد میکند و فایلهای کلاس تولید نمیشوند. چنین پیامی همچنین هنگام تلاش برای تبدیل عبارات نوع بایت یا short به متغیری از نوع char صادر می شود. اگر همچنان نیاز به انجام چنین تبدیل هایی دارید، از عملیات Cast استفاده کنید که فرمت زیر را دارد: نوع تبدیل) معنی، جایی که نوع تبدیلنوع داده شده را که قرار است به آن تبدیل شود را مشخص می کند معنیبه عنوان مثال، در نتیجه اجرای دستورات: byte x = 71 ; نماد char = (char ) x; متغیر نماد روی "G" تنظیم می شود. اگر یک مقدار ممیز شناور به یک نوع عدد صحیح اختصاص داده شود، در آن صورت (اگر مقدار ممیز شناور یک قسمت کسری داشته باشد) تبدیل نوع صریح نیز رخ می دهد. کوتاه کردن(قطع) اعداد. بنابراین، در نتیجه اجرای عملگر int x = (int ) 77.85 ; متغیر x مقدار 77 را دریافت می کند. اگر مقدار اختصاص داده شده خارج از محدوده باشد تبدیل نوع ، سپس نتیجه تبدیل، باقیمانده تقسیم مقدار بر مدول محدوده نوع اختصاص داده شده خواهد بود (برای اعداد نوع بایت، مدول محدوده 256، به طور خلاصه - 65536، برای int - 4294967296 خواهد بود. و برای مدت طولانی - 18446744073709551616). به عنوان مثال، در نتیجه اجرای دستور byte x = (byte ) 514 ; متغیر x مقدار 2 را دریافت می کند. هنگام تبدیل اعداد صحیح یا اعداد ممیز شناور به کاراکتر، اگر عدد اصلی بین 0 تا 127 باشد، تبدیل به یک کاراکتر اتفاق میافتد، در غیر این صورت کاراکتر روی "؟" تنظیم میشود. هنگام انجام تبدیلهای حسابی و بیتی، تمام مقادیر بایت و کوتاه و همچنین char به int گسترش مییابد (در این مورد، مقدار عددی کد کاراکتر در محاسبات برای char استفاده میشود) سپس، اگر حداقل یک عملوند باشد. از نوع long، نوع عبارت عدد صحیح به long گسترش می یابد. اگر یکی از عملوندها از نوع float باشد، نوع عبارت کامل به float بسط مییابد و اگر یکی از عملوندها از نوع double باشد، نوع نتیجه دو برابر میشود. بنابراین، اگر متغیرها بایت a, c; ب کوتاه؛ سپس در عبارت a + b * c - 15 L + 1.5F + 1.08 - 10; ابتدا، قبل از ارزیابی a + b*c، مقادیر متغیرها به int گسترش مییابد، سپس از آنجایی که ثابت 15 از نوع long است، نتیجه محاسبه به مدت طولانی قبل از تفریق گسترش مییابد. پس از آن، از آنجایی که 1.5 واقعی از نوع float است، نتیجه ارزیابی a + b*c - 15L قبل از اضافه شدن به این حرف به شناور گسترش می یابد. قبل از انجام جمع با عدد 1.08، نتیجه محاسبات قبلی به دو برابر افزایش می یابد (زیرا ثابت های واقعی به طور پیش فرض دو برابر می شوند) و در نهایت، قبل از انجام آخرین جمع، لفظ 10 (int به طور پیش فرض) خواهد بود. به دو برابر گسترش یافت . بنابراین، نتیجه ارزیابی عبارت از نوع double خواهد بود. بسط نوع خودکار (به ویژه بسط های کوتاه و بایت به int) می تواند باعث ایجاد خطاهای زمان کامپایل ضعیف شود. به عنوان مثال، در دستورات: بایت x = 30 , y = 5 ; x = x + y; مقدار x و y قبل از انجام جمع به int گسترش مییابد، و سپس هنگام تلاش برای نسبت دادن نتیجه یک محاسبه int به یک متغیر بایت، خطایی ایجاد میشود. برای جلوگیری از این امر، باید از تبدیل نوع صریح در عملگر دوم استفاده شود: x = (byte ) (x + y) ; عبارت x + y باید پرانتز شود زیرا تقدم عملیات ریخته گری پرانتز شده بالاتر از تقدم عملگر جمع است. به هر حال، اگر عملگر دوم را به صورت زیر بنویسیم: x += y; سپس هیچ پیام خطایی وجود نخواهد داشت. لینک اولعملگرهای منطقی فقط با عملوندهای نوع کار می کنند بولی. همه عملگرهای منطقی با دو عملوند دو مقدار منطقی را ترکیب می کنند تا مقدار منطقی حاصل را تشکیل دهند. با اشتباه نگیرید.
جدول عملگرهای منطقی در جاوا
عملگرهای منطقی & , | , ^ بر روی مقادیر نوع عمل کنید بولیبه همان روشی که با توجه به بیت های مقادیر صحیح. عملگر بولی ! یک حالت بولی را معکوس می کند (معکوس می کند): !درست == نادرستو نادرست == درست است.
جدول. نتایج اجرای عملگرهای منطقی
آ | ب | A | ب | A&B | A^B | !آ |
---|---|---|---|---|---|
نادرست | نادرست | نادرست | نادرست | نادرست | درست است، واقعی |
درست است، واقعی | نادرست | درست است، واقعی | نادرست | درست است، واقعی | نادرست |
نادرست | درست است، واقعی | درست است، واقعی | نادرست | درست است، واقعی | درست است، واقعی |
درست است، واقعی | درست است، واقعی | درست است، واقعی | درست است، واقعی | نادرست | نادرست |
میانبر عملگرهای بولی
علاوه بر اپراتورهای استاندارد و (&)و یا (|)میانبرهایی وجود دارد && و || .
اگر به جدول نگاه کنید، می بینید که نتیجه اجرای عملگر است یابرابر است درست است، واقعی درست است، واقعیبدون توجه به مقدار عملوند B. به همین ترتیب، نتیجه اجرای عملگر وبرابر است نادرستزمانی که مقدار عملوند A باشد نادرست، صرف نظر از مقدار عملوند B. معلوم می شود که اگر بتوان نتیجه را از قبل از عملوند اول مشخص کرد، نیازی به محاسبه مقدار عملوند دوم نداریم. این در مواردی که مقدار عملوند سمت راست به مقدار سمت چپ بستگی دارد راحت می شود.
مثال زیر را در نظر بگیرید. فرض کنید ما یک قانون را معرفی کرده ایم - بسته به تعداد موش های صید شده در هفته، به گربه غذا بدهید یا نه. علاوه بر این، تعداد موش ها به وزن گربه بستگی دارد. هر چه گربه بزرگتر باشد موش های بیشتری باید بگیرد.
گربه که وضعیت مشکل را خواند از من دلخور شد. او گفت که من از زمان عقب مانده ام و در حیاط قرن بیست و یکم - موش ها را می توان با تله موش گرفت. باید به او توضیح می دادم که این فقط یک مشکل است و نمونه ای از زندگی شخصی او نیست.
intmouse; // تعداد موش در وزن; // وزن گربه بر حسب گرم موش = 5; وزن = 4500; اگر (موس != 0 و وزن / ماوس< 1000) { mInfoTextView.setText("Можно кормить кота"); }
اگر برنامه را اجرا کنید، مثال بدون مشکل کار می کند - پنج موش در هفته برای پذیرایی از گربه با یک صبحانه خوشمزه کافی است. اگر او چهار موش را بگیرد، مشکلات با تغذیه گربه شروع می شود، اما نه با برنامه - کار خواهد کرد، به سادگی پیامی در مورد اجازه تغذیه انگل نشان نمی دهد.
حال بیایید یک مورد افراطی را در نظر بگیریم. گربه تنبل شد و یک موش هم نگرفت. مقدار متغیر موشبرابر 0 خواهد بود و یک عملگر تقسیم در عبارت وجود دارد. اما شما نمی توانید بر 0 تقسیم کنید و برنامه ما با یک خطا بسته می شود. به نظر می رسد که ما گزینه را با 0 ارائه کرده ایم، اما جاوا هر دو عبارت را ارزیابی می کند ماوس != 0و وزن / ماوس< 1000 ، با وجود این واقعیت که قبلاً در عبارت اول برمی گردد نادرست.
بیایید شرط را به صورت زیر بازنویسی کنیم (فقط یک کاراکتر اضافه کنید):
اگر (موس != 0 && وزن / ماوس< 1000) { mInfoTextView.setText("Можно кормить кота"); }
اکنون برنامه بدون کرش اجرا می شود. یک بار جاوا دید که اولین عبارت برگشت نادرست، سپس عبارت تقسیم دوم به سادگی نادیده گرفته می شود.
اپراتورهای مخفف وو یامعمولاً در مواقعی استفاده می شود که عملگرهای منطقی بولی مورد نیاز است و بستگان تک کاراکتری آنها برای عملیات بیتی استفاده می شود.
اپراتور سه تایی
زبان جاوا همچنین دارای یک عملگر شرطی سه تایی ویژه است که می تواند برای جایگزینی انواع خاصی از عملگرها استفاده شود. اگر-پس-دیگریک اپراتور است ?:
عملگر سه تایی از سه عملوند استفاده می کند. عبارت به شکل زیر نوشته شده است:
Boolean Condition؟ بیان1: بیان2
اگر شرط بولیبرابر است درست است، واقعی، سپس محاسبه می شود بیان 1و نتیجه آن نتیجه اجرای کل دستور می شود. اگر شرط بولیبرابر است نادرست، سپس محاسبه می شود بیان 2، و مقدار آن نتیجه عملگر می شود. هر دو عملوند بیان 1و بیان 2باید مقداری از همان نوع (یا سازگار) را برگرداند.
مثالی را در نظر بگیرید که در آن متغیر آبسوالاختصاص یک مقدار مطلق به یک متغیر val.
int absval, val; val = 5; آبسوال = وال< 0 ? -val: val; // выводим число mInfoTextView.setText("" + absval); val = -5; absval = val < 0 ? -val: val; mInfoTextView.setText("" + absval);
متغیر آبسوالمقدار متغیر تخصیص داده می شود valاگر مقدار بزرگتر یا مساوی صفر باشد (بخش دوم عبارت). اگر مقدار متغیر val منفی است، سپس متغیر آبسوالمقدار متغیر تخصیص داده می شود، با علامت منفی گرفته می شود، در نتیجه، منهای ضربدر منهای یک مثبت، یعنی یک مقدار مثبت می دهد. بیایید با استفاده از کد را بازنویسی کنیم اگر دیگری:
اگر (val< 0) absval = -val; else absval = val;
می توانید مثال دیگری را با عملگر سه تایی ببینید.
عملگرهای منطقی اتصال کوتاه && و || برای عملیات منطقی AND (AND) و OR (OR) روی عباراتی از نوع بولی در نظر گرفته شده است. توجه داشته باشید که هیچ عملگر منطقی مختصری برای عملیات XOR (OR انحصاری) وجود ندارد.
عملگرهای منطقی میانبر مشابه عملگرهای & و | هستند اما بر خلاف آنها از آنها استفاده می شود فقطبه عبارات نوع بولی و هرگز برای انواع انتگرال اعمال نمی شود. با این حال، && و || دارای ویژگی قابل توجهی هستند که اگر بتوان نتیجه را از بخشی از عبارت استنتاج کرد، ارزیابی یک عبارت را کوتاه می کنند (این را با مثال هایی کمی بعد توضیح خواهم داد). به دلیل این ویژگی، && و || به طور گسترده ای برای رسیدگی به عبارات تهی استفاده می شود. آنها همچنین به افزایش اثربخشی کل برنامه کمک می کنند.
ویژگی کوتاه کردن مستقیماً از تفاوت بین &&/|| ناشی می شود و &/|: آخرین جفت عملگرها باید مقادیر عملگرهای چپ و راست را به عنوان ورودی دریافت کنند، در حالی که برای اولین جفت عملگرها گاهی اوقات برای برگرداندن مقدار عملوند چپ کافی است که مقدار آن را بدانیم. ارزش کل عبارت این رفتار عملگرهای منطقی کوتاه شده بر اساس دو قانون ریاضی جدول صدق منطقی است:
- اگر مقدار حداقل یکی از عملوندهای آن نادرست باشد، یک عبارت با عملگر AND نادرست است.
- یک عبارت با عملگر OR در صورتی درست است که حداقل یکی از عملوندهای آن درست باشد.
- نادرست و X = نادرست
- درست یا X = درست است
یک مثال کد را در نظر بگیرید که اگر رشته غیر پوچ و بیش از 20 کاراکتر باشد، پیام String را چاپ می کند:
1. if ((s != null) && (s.length() > 20)) (
2. System.out.println(s);
3. }
همان کار را می توان به طور متفاوت کدگذاری کرد:
1. if (s != null) (
2. اگر (s.length() > 20) (
3. System.out.println(s);
4. }
5. }
اگر رشته s null بود، وقتی متد s.length() را فراخوانی می کردیم، یک NullPointerException دریافت می کردیم. با این حال، در هیچ یک از دو مثال کد، چنین وضعیتی پیش نخواهد آمد. به طور خاص، در مثال دوم، s.length() زمانی که s = null فراخوانی نمی شود، به لطف عملگر کوتاه &&. اگر تست (s!=null) false (false) را برگرداند، یعنی s یک رشته غیرموجود است، آنگاه کل عبارت نادرست بودن تضمین میشود. این بدان معنی است که نیازی به محاسبه مقدار عملوند دوم، یعنی عبارت (s.length()>20) نیست.
با این حال، این اپراتورها عوارض جانبی دارند. به عنوان مثال، اگر عملوند سمت راست عبارتی است که عملیاتی را انجام می دهد، در صورت استفاده از عملگرهای کوتاه شده، اگر عملوند سمت چپ نادرست باشد، این عمل ممکن است با شکست مواجه شود.
به یک مثال توجه کنید:
// مثال اول 1. int val = (int)(2 * Math.random()); 2. آزمون بولی = (val == 0) || (++val == 2); 3. System.out.println("test = " + test + "\nval = " + val); // مثال دوم 1. int val = (int)(2 * Math.random()); 2. آزمون بولی = (val == 0)|(++val == 2); 3. System.out.println("test = " + test + "\nval = " + val);
نمونه اول گاهی اوقات چیزی شبیه به این را چاپ می کند:
تست = درست
val = 0
و گاهی این:
تست = درست
val = 2
مثال دوم گاهی اوقات چیزی شبیه به این را چاپ می کند:
تست = درست
val = 1
و گاهی این:
تست = درست
val = 2
و موضوع اینجاست. اگر val 0 باشد، عملوند دوم (++val) هرگز ارزیابی نخواهد شد، یعنی val صفر خواهد ماند. اگر ابتدا val برابر با یک باشد، در نتیجه این متغیر افزایش می یابد و val = 2 را خواهیم دید. در مثال دوم، با استفاده از نهعبارات کوتاه شده، افزایش همیشه اجرا می شود و بسته به مقدار تصادفی انتخاب شده در مرحله اول، نتیجه همیشه 1 یا 2 خواهد بود. در هر دو مثال، تست روی true تنظیم شده است زیرا یا val = 0 یا val = 1 و به 2 افزایش می یابد.
بیایید اطلاعات مربوط به عملگرهای کوتاه نویسی && و || را خلاصه کنیم:
- آنها برای عملوندهای نوع بولی اعمال می شوند.
- آنها ارزش عملوند راست را فقط در صورتی ارزیابی می کنند که نتوان نتیجه را از مقدار عملوند چپ محاسبه کرد:
- نادرست و X = نادرست
- درست یا X = درست است
بیشتر عملیات روی انواع اولیه با متدها انجام نمی شود، بلکه با نمادهای خاصی که نامیده می شوند انجام می شود علامت عملیات.
عملیات واگذاری
تخصیص مقدار یک ثابت، متغیر دیگر یا یک عبارت (متغیرها و/یا ثابت هایی که با علائم عملگر از هم جدا شده اند) به یک متغیر گفته می شود. عملیات واگذاریو با علامت " = "، به عنوان مثال: x = 3 ; y = x; z = x؛ در جاوا، می توان از عملگر انتساب چندین بار در یک عبارت استفاده کرد، به عنوان مثال: x1 = x2 = x3 = 0 ؛ این عملیات از از راست به چپ، یعنی ابتدا به متغیر x3 مقدار 0 اختصاص داده می شود، سپس به x2 مقدار x3 (0) و در نهایت به x1 به مقدار x2 اختصاص می یابد (0) علائم عملیاتی که آرگومان های آنها اعداد هستند به دو دسته تقسیم می شوند. : یگانه(یونری) علائم عملیات با یک آرگومان و دودویی(دودویی) با دو آرگومان.عملیات Unary
جاوا عملیات Unary زیر را تعریف می کند:- unary minus "-" - علامت یک عدد یا عبارت را به مخالف تغییر می دهد.
- unary plus " + " - هیچ عملیاتی را روی یک عدد یا عبارت انجام نمی دهد.
- مکمل بیتی "~" (فقط برای اعداد صحیح) - همه بیت های فیلد عدد را معکوس می کند (0 به 1 و 1 به 0 تغییر می کند).
- افزایش "++" (فقط برای اعداد صحیح) - مقدار متغیر را 1 افزایش می دهد.
- کاهش "-" (فقط برای اعداد صحیح) - مقدار متغیر را 1 کاهش می دهد.
عملیات باینری حسابی
جاوا موارد زیر را تعریف می کند عملیات باینری حسابی:- اضافه کردن "+"؛
- منها کردن "-"؛
- ضرب " * "؛
- تقسیم "/"؛
- محاسبه باقیمانده تقسیم اعداد صحیح " % " (باقی مانده تقسیم عدد اول بر دوم را برمی گرداند و نتیجه همان علامت سود سهام خواهد بود) ، به عنوان مثال ، نتیجه عملیات 5٪ 3 می شود 2 و نتیجه عملیات (-7) %(-4) برابر با -3 خواهد بود. در جاوا، این عملیات برای متغیرهای واقعی (از نوع float یا double) نیز قابل استفاده است.
عملیات بیتی
- عملیات بیتی مقادیر عددی اصلی را به عنوان فیلدهای بیت در نظر گرفته و عملیات زیر را بر روی آنها انجام می دهد:
- تنظیم ضربان به منموقعیت -امین فیلد نتیجه 1 است اگر هر دو بیت داخل باشند من-ام موقعیت عملوندها برابر با 1 یا 0 در غیر این صورت بیتی و (" & ") است.
- تنظیم ضربان به منموقعیت -امین فیلد نتیجه 1 است اگر حداقل یک بیت در آن باشد منموقعیت -امین عملوندها 1 یا 0 است در غیر این صورت - به صورت بیتی OR (" | ");
- تنظیم ضربان به منموقعیت -امین فیلد نتیجه 1 است اگر بیت ها وارد شوند منموقعیت های -امین عملوندها با یکدیگر برابر نیستند، یا با 0 در غیر این صورت - انحصاری بیتی OR (" ^ ");
- با تعداد بیت هایی که توسط عملوند دوم تعیین می شود به سمت چپ بیت های فیلد عملوند اول تغییر دهید (بیت علامت عدد در این مورد تغییر نمی کند) - با در نظر گرفتن علامت "به سمت چپ حرکت کنید.<< ";
- جابجایی به سمت راست بیت های فیلد عملوند اول با تعداد بیت های تعیین شده توسط عملوند دوم (بیت علامت عدد در این مورد تغییر نمی کند) - با در نظر گرفتن علامت به سمت راست حرکت کنید. " >>"؛
- شیفت به سمت راست بیت های فیلد عملوند اول با تعداد بیت هایی که توسط عملوند دوم تعیین می شود (بیت علامت عدد نیز در این مورد جابه جا می شود) - به صورت بیتی بدون در نظر گرفتن ">> به سمت راست تغییر می کند. >" علامت بزنید.
به صورت بیتی و
int x = 112 ; int y = 94 ; intz; z=x & y; // z=80: 00000000 00000000 00000000 01010000بیتی OR
int x = 112 ; // x: 00000000 00000000 00000000 01110000 int y = 94 ; // سال: 00000000 00000000 00000000 01011110 intz; z=x | y; // z = 126: 00000000 00000000 00000000 01111110XOR بیتی
int x = 112 ; // x: 00000000 00000000 00000000 01110000 int y = 94 ; // سال: 00000000 00000000 00000000 01011110 intz; z=x^y; // z = 46: 00000000 00000000 00000000 00101110شیفت چپ با علامت
int x = 31 , z; // x: 00000000 00000000 00000000 00011111 z=x<< 2 ; // z = 124: 00000000 00000000 00000000 01111100شیفت به راست با علامت
int x = - 17 , z; z = x >> 2 ; // z = -5: 11111111 11111111 11111111 11111011بدون علامت به راست تغییر دهید
int x = - 17 , z; // x: 11111111 11111111 11111111 11101111 z = x >>> 2 ; // z = 1073741819 // z: 00111111 11111111 11111111 11111011
عملیات ترکیبی
در جاوا برای عملیات حسابی باینری می توانید استفاده کنید ترکیب شدهعلائم عملیات (ترکیب): شناسه عملیات = عبارت این معادل عملیات زیر است: شناسه = عبارت شناسه عملیات مثالها:- عبارت x += b به معنای x = x + b است.
- عبارت x -= b به معنای x = x - b است.
- عبارت x *= b به معنای x = x * b است.
- عبارت x /= b به معنای x = x / b است.
- عبارت x %= b به معنای x = x % b است.
- عبارت x &= b به معنای x = x & b است.
- عبارت x |= b به معنای x = x | ب
- عبارت x ^= b به معنای x = x ^ b است.
- بیان x<<= b означает x = x << b .
- عبارت x >>= b به معنای x = x >> b است.
- عبارت x >>>= b به معنای x = x >>> b است.
عملیات مقایسه
جاوا عملگرهای مقایسه زیر را تعریف می کند:- " == " (برابر)، " != " (برابر نیست)،
- " > " (بزرگتر از)، " >= " (بزرگتر یا مساوی)،
- " < " (меньше) " <= " (меньше или равно)
عملیات بولی
عملیات بولیبر روی متغیرهای بولی انجام می شود و نتیجه آنها نیز مقداری از نوع است بولی. جاوا عملیات بولی زیر را تعریف می کند:- نفی "!" – جایگزینی false با true یا بالعکس
- عملگر AND "&" - نتیجه فقط در صورتی درست است که هر دو عملوند درست باشند، در غیر این صورت نتیجه نادرست است.
- OR عملیات "|" - نتیجه فقط در صورتی درست است که حداقل یکی از عملوندها درست باشد، در غیر این صورت نتیجه نادرست است.
- عملگر XOR "^" - نتیجه فقط در صورتی درست است که عملوندها با یکدیگر برابر نباشند، در غیر این صورت نتیجه نادرست است.
عملیات مشروط
عملگر شرطی به شکل express-1?expression-2:expression-3 نوشته شده است. این ابتدا عبارت-1 را ارزیابی می کند، که باید یک مقدار بولی ایجاد کند، و سپس، اگر عبارت-1 درست باشد، عبارت-2 را به عنوان نتیجه عملیات ارزیابی و برمی گرداند، یا (اگر عبارت-1 به نادرست ارزیابی شود)، ارزیابی می کند و ، عبارت-3 به عنوان نتیجه عملیات برگردانده می شود. نمونه ای از عملیات مشروط: x= n> 1 ? 0:1; متغیر x اگر n>1 باشد، مقدار 0 به آن اختصاص داده می شود (عبارت n>1 به درستی ارزیابی می شود) یا 1 اگر n≤1 (عبارت n>1 به نادرست ارزیابی می شود).تقدم عملیات
عملیات در عبارات از چپ به راست انجام می شود، اما با توجه به اولویت آنها. بنابراین عملیات ضرب در عبارت y = x + z* 5 ; قبل از عمل جمع اجرا خواهد شد زیرا عملیات ضرب اولویت بیشتری نسبت به عملیات جمع دارد. اولویت های عملیات (به ترتیب کاهش اولویت) در جاوا در جدول آورده شده است. 1.پرانتزها اولویت عملیاتی را که در داخل آنها قرار دارد افزایش می دهد. بنابراین، اگر براکت ها را در عبارت بالا وارد کنید: y = (x + z) * 5 ; سپس ابتدا عملیات جمع و سپس عملیات ضرب انجام می شود. گاهی اوقات از پرانتز برای خوانایی بیشتر یک عبارت استفاده می شود، به عنوان مثال: (x > 1 ) && (x<= 5 ) ;