بعد از عملگرهای یکنواخت، عملگرهای حسابی به ترتیب اولویت قرار می گیرند. این گروه شامل چهار عملگر رایج است: جمع، تفریق، ضرب و تقسیم. و نه تنها آنها. یک عملگر مدول نیز وجود دارد که با % نشان داده می شود. عملگرهای حسابیبه دو گروه تقسیم می شوند. اولین گروه با اولویت بالاتر شامل *، /، ٪ است. در دومی به ترتیب + و -.
ضرب و تقسیم (* و /)
عملگرهای * و / ضرب و تقسیم را روی همه انواع عددی و کاراکتر اولیه انجام می دهند. از تقسیم بر صفر نتیجه می شود Arithmetic Exception .
احتمالاً تعجب می کنید که چرا از ضرب و تقسیم به شما می گویم که از کلاس اول ابتدایی می دانید. با این حال، در برنامه نویسی با محدودیت هایی در ارتباط با نمایش اعداد در رایانه روبرو هستیم. این محدودیت ها برای همه اعمال می شود فرمت های اعداد، از بایت به دو برابر. اما آنها بیشتر برای نوع عدد صحیح int قابل توجه هستند.
اگر دو عدد را ضرب یا تقسیم کنید، نتیجه با استفاده از حساب اعداد صحیح محاسبه میشود و در int یا long ذخیره میشود. اگر اعداد بسیار بزرگ باشند، نتیجه بزرگتر خواهد بود حداکثر تعدادکه در این اعداد قابل نمایش است. این بدان معنی است که نتیجه به درستی توسط رایانه رمزگذاری نمی شود و منطقی نخواهد بود. به عنوان مثال، از نوع بایت برای نمایش اعداد در محدوده -128 تا 127 استفاده می شود. اگر 64 و 4 را ضرب کنیم، نتیجه 256 که دارای 9 کاراکتر در نماد دودویی 100000000 است، به صورت 0 کد می شود زیرا بایت فقط از 8 کاراکتر استفاده می کند. .
تقسیم را در نظر بگیرید. اگر در حساب اعداد صحیح تقسیم کنید، نتیجه باید عدد صحیح باشد. و این یعنی کسرگم خواهد شد. به عنوان مثال، 7/4 به ما 1.75 می دهد، اما در حساب عدد صحیح 1 خواهد بود.
بنابراین، اگر شما با عبارات پیچیده، می توانید دنباله ضرب و تقسیم را انتخاب کنید. اما به خاطر داشته باشید که ضرب می تواند منجر به این شود سرریز، و تقسیم - به از دست دادن دقت. حکمت عامیانهمعتقد است که ابتدا ضرب و سپس تقسیم در اکثر موارد نتیجه صحیح را به همراه دارد. یک مثال را در نظر بگیرید:
1. int a = 12345, b = 234567, c, d;
2. طولانی e, f;
3.
4. c = a * b / b; // باید برابر با a=12345 باشد
5. d = a / b * b; // همچنین باید برابر با a=12345 باشد
6. System.out.println("a" + a + است
7. "\nb" + b + است
8. "\nc" + c + است
9. "\nd is" + d);
10.
11. e = (طولانی) a * b / b;
12. f = (طولانی) a / b * b;
13. System.out.println(
14. "\ne" + e + است
15. "\nf is" + f);
خروجی این قطعه به صورت زیر خواهد بود:
A 12345 است
b 234567 است
c برابر 5965- است
d 0 است
e 12345 است
f 0 است
خجالت نکش مقادیر عددی این مثال. نکته مهم این است که وقتی ابتدا ضرب را انجام دادیم، وقتی آن را در کدگذاری کردیم، یک سرریز دریافت کردیم (c برابر با 5965 است). int را تایپ کنید. با این حال، اگر آن را به یک نوع طولانی تر، مانند طولانی، متصل کنیم، می توانیم نتیجه صحیح را بدست آوریم. در هر دو مورد، اعمال تقسیم ابتدا صرف نظر از طول نوع آن، برای نتیجه فاجعه بار خواهد بود.
مدول %
نتیجه تقسیم مدول باقیمانده تقسیم است. برای مثال، 7/4 برابر است با 1 با باقیمانده 3. بنابراین، 7% 4 = 3. معمولا عملوندها از نوع صحیح هستند، اما گاهی اوقات عملگر برای اعداد ممیز شناور اعمال می شود. همچنین باید از برخی موارد آگاه باشید اپراتور داده شدهزمانی که عملوندها منفی هستند.
برای عملوندهای منفی یا کسری، قانون به این صورت است: عملوند سمت راست را از سمت چپ کم کنید تا آخرین آن از اولی کمتر شود.مثال ها:
17%5 = ? 17-5=12>5; 12-5=7>5; 7-5=2<5. Значит 17%5 = 2
21%7? 21-7=14>7; 14-7=7=7; 7-7=0<7. Значит 21%7 = 0
7.6%2.9? 7.6-2.9=4.7>2.9; 4.7-2.9=1.8<2.9. Значит 7.6%2.9=1.8
نکته: علامت نتیجه (مثبت یا منفی) کاملاً با علامت عملوند سمت چپ، یعنی سود سهام تعیین می شود.
وقتی تقسیم مدول بر روی اعداد کسری انجام می شود، ماهیت این عمل این است که مقسوم علیه را چندین بار کم کنیم. نتیجه می تواند یک عدد کسری نیز باشد.
یک قانون ساده برای عملوندهای منفی این است: علامت منهای را از عملوندها رها کنید، عملوندهای مثبت را مدول کنید، و اگر عملوند چپ (سود سهام) منفی بود، نتیجه را با یک منهای پیشوند کنید.
اگر مقسوم علیه (عملوند سمت راست) صفر باشد، تقسیم مدول، مانند تقسیم معمولی، می تواند یک ArithmeticException ایجاد کند.
اکثر عملیات روی انواع اولیه با متدها انجام نمی شود، بلکه با نمادهای خاصی به نام انجام می شود علامت عملیات.
عملیات واگذاری
تخصیص مقدار یک ثابت، متغیر دیگر یا یک عبارت (متغیرها و/یا ثابت هایی که با علائم عملگر از هم جدا شده اند) به یک متغیر گفته می شود. عملیات واگذاریو با علامت " = "، به عنوان مثال: x = 3 ; y = x; z = x؛ در جاوا، می توان از عملگر انتساب چندین بار در یک عبارت استفاده کرد، به عنوان مثال: x1 = x2 = x3 = 0 ؛ این عملیات از از راست به چپ، یعنی ابتدا به متغیر x3 مقدار 0، سپس x2 به مقدار x3 (0) و در نهایت x1 به مقدار x2 (0) اختصاص داده می شود. : یگانه(یونری) علائم عملیات با یک آرگومان و دودویی(دودویی) با دو آرگومان.عملیات Unary
جاوا عملیات Unary زیر را تعریف می کند:- unary منهای "-" - علامت یک عدد یا عبارت را به مخالف تغییر می دهد.
- 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 ; قبل از عمل جمع اجرا خواهد شد زیرا عملیات ضرب اولویت بیشتری نسبت به عمل جمع دارد. اولویت های عملیات (به ترتیب کاهش اولویت) در جاوا در جدول آورده شده است. یکی![](https://i2.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/03/168e45.png)
تبدیل نوع و ریخته گری هنگام انجام عملیات
عملیات انتساب و عبارات حسابی می توانند از لفظ، متغیرها و عبارات مختلف استفاده کنند، به عنوان مثال: double y; بایت y = x + 5 ; این مثال متغیر بایت x و لفظی 5 (نوع int) را اضافه می کند و نتیجه را به متغیر دوتایی y اختصاص می دهد. در جاوا، مانند زبان C، تبدیل نوع در ارزیابی عبارات می تواند به طور خودکار یا با کمک یک عملگر نوع ریخته گری انجام شود. با این حال، قوانین مربوط به نوع ریخته گری تا حدودی با قوانین زبان C متفاوت است و به طور کلی سخت تر از زبان C است. هنگام انجام یک عملیات انتساب، تبدیل نوع به طور خودکار اتفاق می افتد اگر تحول گسترده(تبدیل گسترده) و دو نوع سازگار هستند. دگرگونیهای گستردهتر، تبدیلها هستند بایت® کوتاه® بین المللی® طولانی® شناور® دو برابر. برای گسترش تبدیل، انواع عددی، از جمله عدد صحیح و ممیز شناور، با یکدیگر سازگار هستند. با این حال، انواع عددی با انواع char و boolean سازگار نیستند. نوع char و boolean نیز با یکدیگر سازگار نیستند. زبان جاوا همچنین هنگام ذخیره یک ثابت اعداد صحیح واقعی (که به طور پیشفرض دارای نوع int است) در متغیرهای نوع بایت، کوتاه یا طولانی، تبدیل خودکار نوع را انجام میدهد (اما اگر literal مقداری خارج از محدوده مقادیر معتبر برای در این نوع، یک پیغام خطا ارسال می شود: احتمال از دست دادن دقت). اگر تبدیل در حال باریک شدن باشد (تبدیل باریک)، یعنی تبدیل بایت ¬ کوتاه ¬ کاراکتر ¬ طول ¬ شناور ¬ دو برابر باشد، آنگاه چنین تبدیلی ممکن است منجر به از دست دادن دقت عدد یا تحریف آن شود. بنابراین، تبدیلهای باریک هنگام کامپایل شدن برنامه، یک تشخیص ناسازگاری نوع ایجاد میکند و فایلهای کلاس تولید نمیشوند. چنین پیامی همچنین هنگام تلاش برای تبدیل عبارات نوع بایت یا 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 را دریافت می کند. هنگام تبدیل اعداد صحیح یا شناور به داده های کاراکتر، تبدیل به یک کاراکتر در صورتی اتفاق می افتد که عدد اصلی بین 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 قبل از اضافه شدن به این حرف به float گسترش می یابد. قبل از انجام جمع با عدد 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; سپس هیچ پیام خطایی وجود نخواهد داشت. لینک اولبیایید با یکی از رویکردهای وارد کردن داده از جریان استاندارد از طریق کلاس بپردازیم java.util.Scanner. بیایید این کار را به عنوان مثال یک کار ساده از یک سایت بسیار مفید e-olimp.com انجام دهیم
وظیفه
یک عدد واحد از جریان استاندارد وارد کنید. با فرض اینکه این یک عدد صحیح دو رقمی مثبت است، هر یک از ارقام آن را به طور جداگانه (با فاصله از هم جدا) در خروجی استاندارد چاپ کنید. ترتیب اعداد نباید تغییر کند.
تست ها
هیچ مورد خاصی در الگوریتم در نظر گرفته نشده است. ما سه آزمایش انجام می دهیم - کوچکترین عدد در محدوده مجاز، بزرگترین و مقداری از وسط محدوده.
ورود | خروج |
10 | 1 0 |
99 | 9 9 |
54 | 5 4 |
راه حل
بیایید از کلاس استفاده کنیم java.util.Scanner،برای وارد کردن داده ها در فرمت عدد صحیح و هر دو عدد آن را محاسبه می کنیم.
چاپ ارقام یک عدد صحیح دو رقمی
جاوا
class Main( public void main (string args) java.lang.Exception (java.util.Scanner i = new java.util.Scanner(System.in)؛ int n = i.nextInt() را پرتاب می کند. System.out. println(n / 10 + " " + n % 10); ))
classMain( عمومی استاتیک void main (String args) جاوا را پرتاب می کند. زبان استثنا( جاوا استفاده کنید. اسکنر i = جاوا جدید. استفاده کنید. اسکنر (System.in)؛ int n = i. nextInt(); سیستم. بیرون . println (n / 10 + " " + n % 10 ) ; |
توضیحات
- توصیف یک متغیر مننوع java.util.Scannerو بلافاصله مقدار یک شی جدید از این کلاس را به آن اختصاص دهید. سازنده یک شی ایجاد می کند اسکنریک از ورودی استاندارد. آن ها منبه یک افزونه در جریان ورودی استاندارد تبدیل می شود. این به ما امکان می دهد به جای استفاده از روش، یک عدد صحیح را بخوانیم خواندن() توسط یک بایت.
- با استفاده از روش nextInt() دنباله ای از ارقام را بخوانید و آن را به یک عدد صحیح تبدیل کنید. عدد در متغیر n ذخیره می شود.
- n/ 10 - تعداد ده ها در عدد. ده ها ده برابر کمتر از خود عدد خواهند بود. تقسیم عدد صحیح انجام می شود - تقسیم عدد صحیح.
- n% 10 - باقی مانده تقسیم بر ده - تعداد واحدها - سمت راست ترین رقم عدد را محاسبه می کنیم.
- n/ 10 + » » + n% 10 - یک خط یک فاصله بین دو عدد صحیح وارد کنید. در این مورد، اعداد نیز به یک نمایش رشته تبدیل می شوند و هر سه رشته با هم ادغام می شوند - به نام الحاق رشته. این نحوه عملکرد "+" با داده های رشته است.
افزایش سرعت I/O
با تمام راحتی این رویکرد، نسبتاً کند است و گاهی اوقات وظایف به موقع انجام نمی شود. می توانید با استفاده از StreamTokenizer و PrintWriter سرعت کار را به میزان قابل توجهی افزایش دهید.
این مقدار کد را افزایش می دهد، اما در زمان صرفه جویی می کند.
شتاب I/O
جاوا
واردات java.io.*؛ واردات java.util.*; class Main ( Static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); Static PrintWriter out = New PrintWriter(System.out); static int nextInt() IOException (in.nextToken) را پرتاب می کند. (int)in.nval; ) خالی استاتیک عمومی main(string args) java.lang.Exception را پرتاب می کند ( int n = nextInt(); out.println(n / 10 + " " + n % 10); out.flush( ))))
واردات جاوا io *؛ واردات جاوا استفاده کنید. *؛ classMain( StreamTokenizer static in = StreamTokenizer جدید (New BufferedReader (InputStreamReader جدید (System. in)) ); static PrintWriter out = PrintWriter جدید (System . out ) ; static int nextInt() IOException( |
تحصیل برای "توسعه دهنده بازی" + استخدام
اپراتورها در جاوا
زبان جاوا از عملگرهای معمولی حسابی + - * / برای نمایش جمع، تفریق، ضرب و تقسیم استفاده می کند.
عملگر / اگر هر دو آرگومان آن اعداد صحیح باشند، تقسیم عدد صحیح را نشان می دهد. در غیر این صورت، این عملگر تقسیم ممیز شناور را نشان می دهد. باقیمانده تقسیم اعداد صحیح (یعنی تابع mod) با نماد ٪ نشان داده می شود.
برای مثال، 15/2 برابر با 7، 15% 2 برابر با 1 و 15 است. 0/2 برابر با 7 است. 5.
توجه داشته باشید که تقسیم عدد صحیح بر 0 یک استثنا ایجاد می کند، در حالی که تقسیم بر 0 اعداد ممیز شناور منجر به بی نهایت یا NaN می شود.
برای مقداردهی اولیه متغیرها می توان از عملگرهای حسابی استفاده کرد.
int n = 5;
int a = 2 *n // مقدار متغیر a 10 است.
استفاده از عملگرهای محاسباتی باینری مخفف در عملگرهای انتساب راحت است.
مثلا اپراتور
x + = 4;
معادل اپراتور است
x = x + 4;
(عملگرهای تخصیص اختصاری با اضافه کردن یک نماد عملگر حسابی مانند * یا % قبل از نماد = مانند *= یا %= تشکیل میشوند.)
یکی از اهداف بیان شده زبان جاوا استقلال ماشین است.
محاسبات باید به همان نتیجه منجر شود، صرف نظر از اینکه کدام ماشین مجازی آنها را انجام می دهد. برای محاسبات ممیز شناور، این یک کار غیرمنتظره دشوار بود. نوع دوگانه از 64 بیت برای ذخیره مقادیر عددی استفاده می کند، اما برخی از پردازنده ها از ثبات های ممیز شناور 80 بیتی استفاده می کنند. این رجیسترها دقت بیشتری را در مراحل میانی محاسبه ارائه می دهند. عبارت زیر را به عنوان مثال در نظر بگیرید:
دو برابر w = x * y / z;
بسیاری از پردازندههای اینتل عبارت x*y را محاسبه میکنند و این نتیجه میانی را در یک ثبات 80 بیتی ذخیره میکنند، سپس آن را بر مقدار متغیر z تقسیم میکنند و در نهایت پاسخ را به 64 بیت میاندازند. بنابراین می توانید دقت محاسبات را بهبود بخشید و از سرریز جلوگیری کنید. با این حال، اگر در تمام محاسبات از یک پردازنده 64 بیتی استفاده شود، این نتیجه ممکن است متفاوت باشد.
به همین دلیل، در توضیحات اصلی ماشین مجازی جاوا آمده است که تمام محاسبات میانی باید گرد شوند. این باعث خشم جامعه کامپیوتری شد. سرریز می تواند نه تنها باعث محاسبات گرد شود. در واقع، آنها نسبت به محاسبات دقیق تر کندتر هستند زیرا عملیات گرد کردن زمان معینی را می طلبد. در نتیجه، طراحان زبان جاوا نظر خود را تغییر دادند و به دنبال حل تعارض بین عملکرد بهینه و تکرارپذیری عالی نتایج بودند.
بهطور پیشفرض، توسعهدهندگان VM اکنون به دقت گستردهتری در محاسبات میانی اجازه میدهند. با این حال، روشهایی که با کلمه کلیدی strictfp مشخص شدهاند، باید از عملیات ممیز شناور دقیق استفاده کنند تا از نتایج قابل تکرار اطمینان حاصل شود. به عنوان مثال، روش اصلی را می توان با برچسب کلمه کلیدی مطابق شکل زیر نشان داد:
public static strictfp void main (Args رشته ای)
در این حالت، تمام دستورات داخل متد اصلی، عملیات دقیقی را روی اعداد ممیز شناور انجام خواهند داد.
جزئیات این عملیات ارتباط نزدیکی با ویژگی های پردازنده های اینتل دارد. بهطور پیشفرض، نتایج میانی میتوانند از نمایی توسعهیافته استفاده کنند، اما نه از مانتیسای توسعهیافته. (تراشههای اینتل از گرد کردن مانتیسا بدون از دست دادن عملکرد پشتیبانی میکنند.) بنابراین، تنها تفاوت بین محاسبات پیشفرض و دقیق این است که محاسبات دقیق ممکن است سرریز شوند در حالی که محاسبات پیشفرض اینطور نیستند.
اگر هنگام خواندن این یادداشت چشمانتان کم نور شد، نگران نباشید. برای اکثر برنامه نویسان این سوال کاملا بی ربط است. سرریز در محاسبات ممیز شناور در بیشتر موارد اتفاق نمی افتد. ما در این کتاب از کلمه کلیدی strictfp استفاده نخواهیم کرد.
عملگرهای افزایش و کاهش
البته برنامه نویسان می دانند که یکی از رایج ترین عملیات روی متغیرهای عددی جمع یا تفریق یک متغیر است. جاوا مانند C و C++ دارای عملگرهای افزایشی و کاهشی است: عملگر x++ یک به مقدار فعلی متغیر x اضافه میکند و عملگر x-- یکی از آن کم میکند.
مثلا کد
int n = 12;
n++;
مقدار متغیر n را برابر با 13 می کند.
از آنجایی که این عملگرها مقدار یک متغیر را تغییر می دهند، نمی توان آنها را روی خود اعداد اعمال کرد. به عنوان مثال، عملگر 4++ نامعتبر است.
دو نوع از این اپراتورها وجود دارد. شکل فوق فرم "postfix" عملگر را نشان می دهد که در آن نمادهای عملگر بعد از عملوند قرار می گیرند. همچنین یک فرم "پیشوند" وجود دارد - ++n.
هر دوی این عملگرها مقدار متغیر را یک بار افزایش می دهند. تفاوت بین آنها تنها زمانی آشکار می شود که این عملگرها در داخل عبارات استفاده شوند. فرم پیشوند عملگر افزایش ابتدا یک به مقدار متغیر اضافه می کند، در حالی که فرم پسوند از مقدار قدیمی آن متغیر استفاده می کند.
int m = 7;
int n = 7;
int a = 2 * ++m; // اکنون مقدار a 16 و m برابر 8 است.
int b = 2*n++; // اکنون b 14 و n برابر 8 است.
(از آنجایی که این عملگر ++ بود که نام زبان ++ را به زبان C++ داد، این دلیل اولین شوخی در مورد آن بود. مخالفان اشاره می کنند که حتی نام این زبان دارای یک خطا است: "از جمله موارد دیگر، این زبان باید ++C نامیده شود، زیرا ما می خواهیم از این زبان فقط پس از بهبود استفاده کنیم.")
1. عملیات حسابی پایه
جدول زیر عملیات حسابی اساسی مورد استفاده در زبان جاوا را فهرست می کند:
قوانینی را برای کار با عملیات حسابی در نظر بگیرید:
- عبارات از چپ به راست ارزیابی می شوند مگر اینکه پرانتزها اضافه شوند یا برخی از عملگرها اولویت بیشتری داشته باشند.
- عملگرهای *، / و % بر + و - اولویت دارند.
مثال 1. عملیات حسابی روی مقادیر صحیح
برای مثال در این کد متغیرها آو بمعانی مختلفی خواهد داشت:
کلاس عمومی BasicIntMath ( عمومی استاتیک void main(string args) ( int a = 4 + 5 - 2 * 3; int b = 4 + (5 - 2) * 3; System.out.println("a = " + a) ; System.out.println("b = " + b); ) )
نتیجه اجرا:
A = 3 b = 13
- عمل تفریق یکنواخت علامت عملوند واحد خود را تغییر می دهد.
- عملگر جمع unary به سادگی مقدار عملوند خود را برمی گرداند. اصولاً لازم نیست، اما ممکن است.
مثال 2. عملیات واحد جمع و تفریق
کلاس عمومی UnarySignOperation ( عمومی استاتیک void main(string args) ( double a = -6; double b = +6; System.out.println(a); System.out.println(b); ))- هنگامی که یک عملیات تقسیم بر روی یک نوع داده عدد صحیح انجام می شود، نتیجه آن شامل یک جزء کسری نخواهد بود.
مثال 3. تقسیم عدد صحیح
کلاس عمومی IntDivision ( عمومی استاتیک void main(string args) (int a = 16/5; System.out.println(a);))نتیجه اجرای این برنامه:
- عملوندهای حسابی باید از نوع عددی باشند. عملیات حسابی را نمی توان بر روی انواع داده های بولی انجام داد، اما بر روی انواع داده مجاز است کاراکتر، زیرا در جاوا این نوع در اصل نوعی نوع است بین المللی.
مثال 4. عملیات حسابی روی متغیرهای نوع کاراکتر
کلاس عمومی BasicCharMath1 ( اصلی خالی استاتیک عمومی (رشته آرگ) ( char c = "n"؛ System.out.println(c)؛ System.out.println (c + 1); System.out.println (c / 5) ;))نتیجه اجرا:
N 111 22
مثال 5. عملیات حسابی روی متغیرهای نوع کاراکتر
کلاس عمومی BasicCharMath2 ( اصلی خالی استاتیک عمومی (رشته آرگ) ( char c1 = "1"؛ char c2 = "\u0031"؛ char c3 = 49; System.out.println(c1 + c2 + c3); ))نتیجه اجرا:
عملگر مدول با نماد ٪ نشان داده می شود. این عملگر پس از تقسیم عدد اول بر عدد دوم، باقیمانده را برمی گرداند. هنگام تقسیم یک عدد صحیح، نتیجه نیز یک عدد صحیح است.
مثال 6. تقسیم مدول
کلاس عمومی DivisionByModule ( عمومی استاتیک void main(string args) (int a = 6 % 5; double b = 6.2 % 5.0; System.out.println(a); System.out.println(b); ))نتیجه اجرا:
1 1.2000000000000002
2. عملیات محاسباتی مرکب با انتساب
جاوا عملگرهای خاصی دارد که محاسبات را با انتساب ترکیب می کنند. عبارت زیر را در نظر بگیرید:
A = a + 4;
در جاوا این عملیات را می توان به صورت زیر نوشت:
A += 4;
عملیات تخصیص مرکب نه تنها مقدار کد را کاهش می دهد، بلکه امکان تبدیل خودکار را نیز فراهم می کند که عملیات معمولی انجام نمی دهد.