عملگرهای منطقی فقط با عملوندهای نوع کار می کنند بولی. همه عملگرهای منطقی با دو عملوند دو مقدار منطقی را ترکیب می کنند تا مقدار منطقی حاصل را تشکیل دهند. با اشتباه نگیرید.
جدول عملگرهای منطقی در جاوا
عملگرهای منطقی & , | , ^ بر روی مقادیر نوع عمل کنید بولیبه همان روشی که با توجه به بیت های مقادیر صحیح. عملگر بولی ! یک حالت بولی را معکوس می کند (معکوس می کند): !درست == نادرستو نادرست == درست است.
جدول. نتایج اجرای عملگرهای منطقی
آ | ب | A | ب | A&B | A^B | !آ |
---|---|---|---|---|---|
نادرست | نادرست | نادرست | نادرست | نادرست | درست است، واقعی |
درست است، واقعی | نادرست | درست است، واقعی | نادرست | درست است، واقعی | نادرست |
نادرست | درست است، واقعی | درست است، واقعی | نادرست | درست است، واقعی | درست است، واقعی |
درست است، واقعی | درست است، واقعی | درست است، واقعی | درست است، واقعی | نادرست | نادرست |
میانبر عملگرهای بولی
علاوه بر اپراتورهای استاندارد و (&)و یا (|)میانبرهایی وجود دارد && و || .
اگر به جدول نگاه کنید، می بینید که نتیجه اجرای عملگر است یابرابر است درست است، واقعی درست است، واقعیبدون توجه به مقدار عملوند B. به همین ترتیب، نتیجه اجرای عملگر وبرابر است نادرستزمانی که مقدار عملوند A باشد نادرست، صرف نظر از مقدار عملوند B. معلوم می شود که اگر بتوان نتیجه را از قبل از عملوند اول مشخص کرد، نیازی به محاسبه مقدار عملوند دوم نداریم. این در مواردی که مقدار عملوند سمت راست به مقدار سمت چپ بستگی دارد راحت می شود.
در نظر گرفتن مثال بعدی. فرض کنید ما یک قانون را معرفی کرده ایم - بسته به تعداد موش های صید شده در هفته، به گربه غذا بدهید یا نه. علاوه بر این، تعداد موش ها به وزن گربه بستگی دارد. هر چه گربه بزرگتر باشد موش های بیشتری باید بگیرد.
گربه که وضعیت مشکل را خواند از من دلخور شد. او گفت که من از زمان عقب مانده ام و در حیاط قرن بیست و یکم - موش ها را می توان با تله موش گرفت. باید به او توضیح می دادم که این فقط یک مشکل است و نمونه ای از زندگی شخصی او نیست.
intmouse; // تعداد موش در وزن; // وزن گربه بر حسب گرم موش = 5; وزن = 4500; اگر (موس != 0 و وزن / ماوس< 1000) { mInfoTextView.setText("Можно кормить кота"); }
اگر برنامه را اجرا کنید، مثال بدون مشکل کار می کند - پنج موش در هفته برای پذیرایی از گربه با یک صبحانه خوشمزه کافی است. اگر او چهار موش را بگیرد، مشکلات با تغذیه گربه شروع می شود، اما نه با برنامه - کار می کند، به سادگی پیامی در مورد اجازه تغذیه انگل نشان نمی دهد.
حال بیایید یک مورد افراطی را در نظر بگیریم. گربه تنبل شد و یک موش هم نگرفت. مقدار متغیر موشبرابر 0 خواهد بود و یک عملگر تقسیم در عبارت وجود دارد. اما شما نمی توانید بر 0 تقسیم کنید و برنامه ما با یک خطا بسته می شود. به نظر می رسد که ما گزینه را با 0 ارائه کرده ایم، اما جاوا هر دو عبارت را ارزیابی می کند ماوس != 0و وزن / موس< 1000 ، با وجود این واقعیت که قبلاً در عبارت اول برمی گردد نادرست.
بیایید شرط را به صورت زیر بازنویسی کنیم (فقط یک کاراکتر اضافه کنید):
اگر (موس != 0 && وزن / ماوس< 1000) { mInfoTextView.setText("Можно кормить кота"); }
اکنون برنامه بدون کرش اجرا می شود. یک بار جاوا دید که اولین عبارت برگشت نادرست، سپس عبارت تقسیم دوم به سادگی نادیده گرفته می شود.
اپراتورهای مخفف وو یامعمولاً در شرایطی که به اپراتورها نیاز است استفاده می شود منطق بولی، و بستگان یک کاراکتری آنها برای عملیات بیتی استفاده می شود.
اپراتور سه تایی
AT زبان جاوایک سه تایی خاص نیز وجود دارد عملگر شرطی، که می تواند جایگزین شود انواع خاصیاپراتورها اگر-پس-دیگریک اپراتور است ?:
عملگر سه تایی از سه عملوند استفاده می کند. عبارت به شکل زیر نوشته شده است:
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;
می توانید مثال دیگری را با عملگر سه تایی ببینید.
اکثر عملیات در انواع ابتداییبا روش انجام نمی شود، بلکه با شخصیت های خاصتماس گرفت علامت عملیات.
عملیات واگذاری
وظیفه متغیر ارزشثابت، متغیر یا عبارت دیگری (متغیرها و/یا ثابت هایی که با علائم عملگر جدا شده اند) فراخوانی می شود عملیات واگذاریو با علامت " = "، به عنوان مثال: 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 خواهد بود. AT عملیات جاواهمچنین می تواند برای متغیرهای واقعی (نوع 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 ; قبل از عمل جمع اجرا خواهد شد زیرا عملیات ضرب اولویت بیشتری نسبت به عملیات جمع دارد. اولویت های عملیات (به ترتیب کاهش اولویت) در جاوا در جدول آورده شده است. یکیپرانتزها اولویت عملیاتی را که در داخل آنها قرار دارد افزایش می دهد. بنابراین، اگر براکت ها را در عبارت بالا وارد کنید: 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 ) x; متغیر نماد روی "G" تنظیم می شود. اگر یک مقدار ممیز شناور به یک نوع عدد صحیح اختصاص داده شود، در آن صورت (اگر مقدار ممیز شناور یک قسمت کسری داشته باشد) تبدیل نوع صریح نیز رخ می دهد. کوتاه کردن(قطع) اعداد. بنابراین، در نتیجه اجرای عملگر int x = (int ) 77.85 ; متغیر x مقدار 77 را دریافت می کند. اگر مقدار اختصاص داده شده خارج از محدوده باشد تبدیل نوع ، سپس نتیجه تبدیل، باقیمانده تقسیم مقدار بر مدول محدوده نوع اختصاص داده شده خواهد بود (برای اعداد نوع بایت، مدول محدوده 256، به طور خلاصه - 65536، برای int - 4294967296 خواهد بود. و برای مدت طولانی - 18446744073709551616). به عنوان مثال، در نتیجه اجرای دستور byte x = (byte ) 514 ; متغیر x مقدار 2 را دریافت می کند. هنگام تبدیل اعداد صحیح یا شناور به داده char، تبدیل به یک کاراکتر در صورتی اتفاق میافتد که عدد اصلی بین 0 تا 127 باشد، در غیر این صورت کاراکتر روی "؟" تنظیم میشود. هنگام انجام تبدیلهای حسابی و بیتی، همه مقادیر بایت و کوتاه و همچنین مقادیر char به int گسترش مییابند (در حالی که مقدار عددی کد کاراکتر در محاسبات برای char استفاده میشود) سپس، اگر حداقل یک عملوند از نوع باشد. 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; سپس هیچ پیام خطایی وجود نخواهد داشت. لینک اولآخرین به روز رسانی: 1397/10/30
بیشتر عملیات در جاوا مشابه عملیاتی است که در سایر زبان های مشابه 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); // هشت
-- (کاهش پیشوند)
متغیر را یک بار کاهش دهید، به عنوان مثال 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); // هشت
اولویت عملیات حسابی
برخی از عملیات ها اولویت بیشتری نسبت به سایرین دارند و بنابراین ابتدا اجرا می شوند. عملیات به ترتیب اولویت نزولی:
++ (افزایش)، -- (کاهش)
* (ضرب)، / (تقسیم)، % (باقیمانده تقسیم)
+ (جمع)، - (تفریق)
اولویت عملیات باید هنگام اجرای مجموعه ای از عبارات حسابی در نظر گرفته شود:
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 استفاده می شود که به شما امکان می دهد چنین موقعیت هایی را دور بزنید.
یادداشت های سخنرانی در مورد جاوا. درس 4
(هیچ) (هیچ) ::(هیچ یک)
(V. Fesyunov)
عملیات (اپراتورها) در زبان جاوا
اکثر عملیات جاوا ساده و شهودی هستند. اینها عملیاتی مانند +، -، *، /،<,>و غیره. عملیات ترتیب اجرا و اولویت های خاص خود را دارد. پس در بیان
ابتدا ضرب انجام می شود و سپس جمع انجام می شود، زیرا عملیات ضرب اولویت بیشتری نسبت به عمل جمع دارد. در بیان
ابتدا a + b ارزیابی می شود و سپس c از نتیجه کم می شود، زیرا ترتیب این عملیات از چپ به راست است.
اما عملیات جاوا ویژگی های خاص خود را دارد. بدون پرداختن به توضیح دقیق از ساده ترین عملیات، بیایید روی ویژگی ها تمرکز کنیم.
بیا شروع کنیم با تکالیف. بر خلاف تعدادی از زبان های برنامه نویسی دیگر در جاوا، انتساب یک عملگر نیست، بلکه یک عملیات است. معناشناسی این عملیات را می توان به صورت زیر بیان کرد.
- عملگر انتساب با علامت "=" نشان داده می شود. مقدار عملوند سمت راست خود را ارزیابی می کند و آن را به عملوند سمت چپ خود اختصاص می دهد و مقدار اختصاص داده شده را به عنوان نتیجه برمی گرداند. این مقدار می تواند توسط عملیات های دیگر استفاده شود. دنباله ای از عملیات تخصیص چندگانه از راست به چپ اجرا می شود.
در ساده ترین حالت، همه چیز مثل همیشه به نظر می رسد.
آنچه در اینجا اتفاق می افتد دقیقاً همان چیزی است که به طور شهودی منظور ماست - مجموع a و b محاسبه می شود، نتیجه در x ذخیره می شود. اما در اینجا دو مثال دیگر وجود دارد.
در اولی ابتدا 1 در b وارد می شود، نتیجه عملیات 1 است، سپس این نتیجه در a وارد می شود. در مثال دوم، مجموع a و b محاسبه شده و نتیجه از بین می رود. بی معنی است، اما از نظر نحوی معتبر است.
عملیات مقایسه
اینها عملیات >،<, >=, <=, != и ==. Следует обратить внимание, что сравнение на равенство обозначается двумя знаками "=". Операндами этих операций могут быть арифметические данные, результат — типа boolean.
عملیات افزایش، کاهش
اینها عملیات ++ و -- هستند. بنابراین y++ (افزایش) مخفف y = y +1 است و عملگر کاهش (--) نیز همینطور است.
اما با این عملیات یک نکته ظریف وجود دارد. آنها به دو شکل وجود دارند - پیشوند (++y) و پسوند (y++). عملکرد این عملیات یکسان است - عملوند خود را 1 افزایش می دهند (عملیات کاهش - کاهش) اما نتیجه آنها متفاوت است. فرم پیشوند مقدار عملوندی را که قبلاً با 1 تغییر کرده است برمیگرداند و فرم پسوند مقدار عملوند را قبل از تغییر برمیگرداند.
A=5; x = a++; y = ++a;
در این قطعه، x روی 5 و y روی 7 تنظیم می شود.
عملیات تقسیم عدد صحیح
باید در نظر داشت که تقسیم یک عدد صحیح بر دیگری یک عدد صحیح تولید می کند و گرد نمی شود، بلکه قسمت کسری را کنار می گذارد.
باقیمانده تقسیم (مقدار مدول)
جاوا دارای عملگر % است که مخفف باقیمانده یک تقسیم است.
عملیات واگذاری توسعه یافته
علاوه بر عملیات معمول "=" در جاوا، عملیات +=، -=، *=، /=، و غیره وجود دارد که اینها مخفف هستند. بنابراین a += b کاملاً معادل a = a + b است. همین امر در مورد سایر عملیات های مشابه نیز صادق است.
عملیات بولی
! - نفی && - منطقی "و" || - منطقی "یا"
عملوندهای این عملیات باید از نوع بولی باشند، نتیجه بولی است. عملیات && و || یک ویژگی دارند - عملوند سمت راست آنها ممکن است محاسبه نشود اگر نتیجه از قبل از عملوند چپ شناخته شده باشد. بنابراین، اگر عملوند سمت چپ عملیات && نادرست باشد، عملوند سمت راست ارزیابی نخواهد شد، زیرا نتیجه هنوز نادرست است
این ویژگی باید در نظر گرفته شود، به خصوص زمانی که عملوند سمت راست شامل یک فراخوانی به یک تابع باشد.
عملیات منطقی بیتی
اینها عملیات هستند
& - به صورت بیتی "و" | - bitwise "or" ^ - bitwise "exclusive or" ~ - bitwise negation
آنها برای هر جفت بیت از عملوندهایشان اجرا می شوند.
عملیات شیفت
<< — сдвиг влево >> - شیفت سمت راست >>> - شیفت سمت راست بدون علامت
این عملیات مقدار عملوند سمت چپ خود را با تعداد بیت های داده شده توسط عملوند سمت راست تغییر می دهد.
عملیات مشروط
این تنها عملیات سه گانه است، یعنی. عملیاتی که سه عملوند دارد. بر این اساس، یک علامت عملیات برای آن استفاده نمی شود، بلکه دو علامت.
<условие> ? <выражение1> : < выражение2>
اگر یک<условие>درست است، نتیجه خواهد بود< выражение1>، در غیر این صورت< выражение2>.
به عنوان مثال، "الف< b ? a: b" вычисляет минимум из a и b.
عملیات ریخته گری
این یک عملیات بسیار مهم است. بهطور پیشفرض، همه تبدیلهایی که ممکن است باعث ایجاد مشکل شوند در جاوا غیرفعال هستند. بنابراین، شما نمی توانید مقدار طولانی را به یک عملوند int اختصاص دهید. در مواردی که هنوز لازم است، باید یک تبدیل نوع صریح قرار دهید.
برای مثال، اجازه دهید روش f(...) یک طولانی تولید کند.
intx = (int)f(10);
در اینجا (int) یک عملیات تبدیل نوع است. عملیات تبدیل نوع با نام نوع محصور شده در پرانتز مشخص می شود.
این عملیات نه تنها برای انواع پایه، بلکه برای کلاس ها نیز اعمال می شود. وقتی به وراثت نگاه می کنیم، این موضوع را با جزئیات بیشتری بررسی خواهیم کرد.
لفظ (ثابت)
حسابی
نمونه هایی از ثابت های حسابی
10 - 010 است 8 - 0123 است 83 (1*64 + 2*8 + 3) - 0x10 است 16 - 0x123 است 291 (1*256 + 2*16 +3) - 1e5 است 100000 - 1.23 e-303 است.
پسوندها برای نشان دادن نوع ثابت استفاده می شوند: l (یا L) - طولانی، f (یا F) - شناور، d (یا D) - دو برابر. مثلا،
1L یک واحد است، اما از نوع طولانی است.
حروف بولی
لفظ های بولی درست (درست) و نادرست (نادرست) هستند.
حروف رشته ای
به عنوان مثال در دو نقل قول نوشته شده است
"این یک رشته است"
حروف نویسه
به صورت آپستروف نوشته شده است، به عنوان مثال "F"، "w".
حروف رشته و کاراکتر قوانینی برای نوشتن مطالب ویژه دارند. شخصیت ها. اول، مجموعه ای از موارد ویژه از پیش تعریف شده وجود دارد. شخصیت ها. آی تی
- "\n" - انتهای خط (فید خط) - "\r" - بازگشت کالسکه - "\t" - جدول بندی
و تعدادی دیگر
در مرحله دوم، شما می توانید به صراحت کد کاراکتر را یادداشت کنید (فقط باید آن را بدانید). کد معمولاً در سیستم هشتگانه نوشته میشود: "\001" یک کاراکتر با کد 1 و غیره است.
بیانیه
اپراتور - بیان
نحو
<выражение>;
چنین عملگر از یک عبارت واحد تشکیل شده است که در انتهای آن یک ";" وجود دارد. اثر آن ارزیابی عبارت است، مقدار ارزیابی شده توسط عبارت داده شده از بین می رود. آن ها معمولاً چنین عبارتی حاوی یک عملگر انتساب است، اگرچه این مورد توسط نحو مورد نیاز نیست.
A = 0; x = (a > b ? a: b); cnt++;
بیانیه شرطی (اگر)
نحو
اگر (<условие>) <оператор1>
اینجا<условие>یک عبارت بولی است، i.e. عبارتی که true یا false را برمی گرداند. همانطور که از نحو مشاهده می کنید، قسمت else اختیاری است. یک عبارت بعد از if و بعد از دیگری وجود دارد. اگر باید چندین عملگر را در آنجا قرار دهید، باید آن را قرار دهید مسدود کردن . مسدود کردنبا "(" شروع می شود و با ")" پایان می یابد.
در جاوا مرسوم است که همیشه یک بلوک قرار می دهیم، حتی اگر یک عبارت بعد از if یا else وجود داشته باشد.
اگر (a > b) (x = a; ) else (x = b; ) if (پرچم) (پرچم = نادرست؛ init();)
در مثال آخر، flag یک متغیر یا فیلد بولی است، و init() متدی است که در صورت درست بودن پرچم فراخوانی میشود (مثلاً «اگر پرچم تنظیم شده است»).
بیانیه بازگشت (از قبل پوشش داده شده است)
عملگر حلقه پیش شرط (در حالی که)
نحو
در حالی که (<условие>) <оператор>
مانند دستور if، در جاوا مرسوم است<оператор>در براکت های مجعد قرار دهید.
Int i = 0; در حالی که (بیشتر) (x /= 2؛ بیشتر = (++i< 10); }
در این مثال، بیشتر باید یک متغیر یا فیلد بولی، x مقداری متغیر یا فیلد حسابی باشد. حلقه 10 بار اجرا می شود.
عملگر حلقه پس شرط (do while)
نحو
انجام دادن<оператор>در حالی که (<условие>);
عملگر حلقه پیش شرط تنها با عملگر حلقه پیش شرط تفاوت دارد که همیشه حداقل یک بار تکرار حلقه را اجرا می کند، در حالی که عملگر پیش شرط ممکن است یک تکرار حلقه نداشته باشد (اگر شرط بلافاصله نادرست باشد).
Int i = 0; انجام دهید (x \= 2؛ بیشتر = (++i< 10); } while (more);
عبارت حلقه "با شمارنده" (برای)
نحو
برای (<инициализация>; <условие>; <инкремент>) <оператор>
عنوان چنین چرخه ای شامل سه عبارت (در ساده ترین حالت) است. از نام اپراتور می توان فهمید که برای سازماندهی یک چرخه با شمارنده کار می کند. بنابراین بیان<инициализация>یک بار قبل از اولین تکرار حلقه اجرا می شود. پس از هر بار تکرار حلقه، عبارت اجرا می شود<инкремент>و سپس عبارت<условие>. آخرین عبارت باید منطقی باشد و شرط را برای ادامه حلقه تنظیم کند. آن ها در حالی که درست است، تکرارهای حلقه ادامه خواهند داشت.
برای سهولت در کامپایل کردن عملگرهای حلقه با شمارنده، پسوندهای زیادی در این ساختار معرفی شده است.
- <инициализация>ممکن است یک عبارت نباشد، بلکه یک توصیف با مقدار اولیه مانند "int i = 0" باشد.
- <инициализация>می تواند لیستی از عبارات جدا شده با کاما باشد، به عنوان مثال "i = 0، r = 1" .
- <инкремент>همچنین می تواند فهرستی از عبارات باشد، به عنوان مثال "i++، r*=2"
- تمامی اجزا (<инициализация>, <условие>و<инкремент>) اختیاری هستند. برای بیان<условие>این بدان معنی است که شرط همیشه درست در نظر گرفته می شود (یعنی خروج از حلقه باید با وسایلی در درون خود حلقه سازماندهی شود).
آن ها حلقه زیر (حلقه بی نهایت) نیز امکان پذیر است:
برای (؛؛) ( . . . )
برای (int i = 0; i< 10; i++) x /=2;
این "اقتصادی" ترین پیاده سازی حلقه از نمونه های قبلی است.
شکستن و ادامه بیانیه ها
هیچ عبارت goto در جاوا وجود ندارد. همانطور که می دانید، goto منجر به برنامه های بدون ساختار می شود. دستورهای break و continue مشابه ساختار یافته goto هستند.
آنها را می توان در حلقه ها استفاده کرد و break را می توان در دستور switch نیز استفاده کرد. اجرای دستور break باعث می شود که حلقه بلافاصله خاتمه یابد. دستور continue باعث پایان تکرار فعلی حلقه و شروع یک حلقه جدید می شود. بررسی شرایط همچنان در این مورد انجام می شود، بنابراین ادامه می تواند باعث پایان حلقه شود.
برای (int i = 0; ;i++) (اگر (فرد فقط && i%2 == 0) ادامه دهید؛ y = (x + 1)/x؛ اگر (y - x< 0.001) break; x = y; }
در اینجا oddOnly یک متغیر بولی است. اگر تنظیم شود، تمام تکرارهای زوج با اعداد حلقه با استفاده از عبارت continue حذف می شوند.
شرط خاتمه حلقه در این مثال در وسط حلقه بررسی می شود و اگر برآورده شد، حلقه با استفاده از دستور break خاتمه می یابد.
با حلقههای تودرتو، دستورهای break و continue میتوانند نه تنها به حلقهای که در آن قرار دارند، بلکه به حلقه محصورکننده نیز اشاره کنند. برای این کار دستور حلقه محصور باید با یک برچسب مشخص شود که باید در دستور break یا continue مشخص شود. مثلا،
Lbl: در حالی که (...) ( . . . برای (...) ( . . اگر (...) شکستن lbl؛ . . .
در اینجا دستور break باعث خاتمه هر دو حلقه for و while می شود.
انتخاب بیانیه (سوئیچ)
برای سازماندهی یک انتخاب بر روی مقداری از یکی از چندین شاخه اجرا خدمت می کند.
نحو
تعویض (<выражение>) ( مورد<константа1>: <операторы1>مورد<константа2>: <операторы2> . . . }
عبارت باید یک مقدار صحیح یا کاراکتر تولید کند، ثابت ها باید از همان نوع مقدار این عبارت باشند.
عناصر "مورد".<константа>:" برچسب های انتقالی هستند، اگر مقدار عبارت با یک ثابت مطابقت داشته باشد، پرش به این برچسب انجام می شود. اگر مقدار عبارت با هیچ یک از ثابت ها مطابقت نداشته باشد، همه چیز به وجود قطعه پیش فرض بستگی دارد. اگر وجود داشته باشد، در صورت عدم وجود، پرش به پیشفرض برچسب رخ میدهد، سپس کل عبارت switch نادیده گرفته میشود.
- در دستور سوئیچ، قطعات کیس هیچ بلوکی را تشکیل نمی دهند. اگر آخرین دستور این قطعه کیس با مورد بعدی همراه شود، اجرا از اولین دستور این قطعه کیس ادامه خواهد داشت.
- به همین دلیل، دستور break معمولا در دستور switch استفاده می شود. در انتهای هر قطعه مورد قرار می گیرد.
مثال (فایل SymbolTest.java)
یک برنامه آزمایشی را در نظر بگیرید که از عبارات for و switch استفاده می کند.
این برنامه به طور تصادفی 100 کاراکتر لاتین تولید می کند و آنها را به عنوان "واکه"، "صامت" و "گاهی مصوت" طبقه بندی می کند. آخرین دسته شامل کاراکترهای "y" و "w" است.
کلاس عمومی SymbolTest ( public static void main(string args) ( for (int i = 0; i< 100; i++) { char c = (char)(Math.random()*26 + "a"); System.out.print(c + ": "); switch (c) { case "a": case "e": case "i": case "o": case "u": System.out.println("гласная"); break; case "y": case "w": System.out.println("иногда гласная"); break; default: System.out.println("согласная"); } } } }
در این مثال، چندین عنصر جدید برای ما وجود دارد.
- از متد تصادفی() کلاس Math استفاده شده است. بیایید نگاهی به مستندات کلاس ریاضی بیندازیم و ببینیم چه کار می کند.
- در عبارت char c = (char)(Math.random()*26 + "a"); مقدار حسابی به نماد اضافه می شود. با این اضافه در جاوا یک کاراکتر به عددی تبدیل می شود که برابر با کد این کاراکتر است.
- در عبارت System.out.print(c + ": "); println(...) نیست، اما print(...) استفاده می شود. روش print(...) با println(...) تنها در این است که در یک خط جدید چاپ نمی شود، به طوری که عبارت print(...) یا println(...) بعدی به چاپ ادامه می دهد. همان خط
همچنین باید به قطعات مورد توجه کنید. به طور رسمی، 7 قطعه از این قبیل وجود دارد، اما 5 مورد از آنها فاقد عملگر هستند. بنابراین، می توانیم در نظر بگیریم که 2 قطعه مورد وجود دارد، اما هر یک از آنها دارای چندین برچسب است.
مشق شب
- 1 SymbolTest.java را تغییر دهید تا تعداد نمادهای تولید شده توسط پارامتر فراخوانی برنامه تنظیم شود.
- 2 برنامه ای بنویسید که دو عدد را به عنوان پارامتر فراخوانی بگیرد - طول پایه های یک مثلث قائم الزاویه، و در نتیجه زاویه ها را بر حسب درجه چاپ کند.
(هیچ یک)