• عملگرهای منطقی عملیات حسابی

    اخرین بروزرسانی: 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 کاهش می دهد.
    نمونه هایی از عملیات واحد "+" و "-": int i = 3 , j, k; j=-i; // j = -3 k = + i; // k = 3 مثال عملیات مکمل بیتی: int a = 15 ; intb; b=~a; // b = -16 اعداد a و b int هستند، یعنی. به صورت داخلی توسط کامپیوتر به عنوان اعداد صحیح دودویی امضا شده با طول 32 بیت نمایش داده می شوند، بنابراین نمایش باینری a و b به این صورت است: در عدد a به 1 بیت در b و 1 بیت در a به بیت صفر تغییر می کند. نمایش دهدهی عدد b 16- خواهد بود. علائم عملگر افزایش و کاهش را می توان قبل یا بعد از یک متغیر قرار داد. این گزینه ها به ترتیب نامیده می شوند پیشوندو پسوندثبت این معاملات علامت پیشوندی عملگر، مقدار عملوند خود را برمی‌گرداند بعد ازارزیابی بیان با علامت گذاری پسوند، علامت عملیات در ابتدامقدار عملوند خود را برمی گرداند و تنها پس از آن افزایش یا کاهش را محاسبه می کند، به عنوان مثال: int x = 1 , y, z; y=++x; z= x++ ; به متغیر y مقدار 2 اختصاص داده می شود زیرا x ابتدا 1 افزایش می یابد و سپس نتیجه به متغیر y اختصاص می یابد. به متغیر z مقدار 1 اختصاص داده می شود زیرا z ابتدا یک مقدار و سپس x با 1 افزایش می یابد. در هر دو مورد، مقدار جدید x 2 خواهد بود. لازم به ذکر است که در جاوا بر خلاف زبان C می توان عملیات کاهش و افزایش را بر روی متغیرهای واقعی (از نوع float و double) نیز اعمال کرد. علائم دودویی عملیاتبه عملیات با نتیجه عددی و عملیات مقایسه تقسیم می شوند که نتیجه آنها یک مقدار بولی است.

    عملیات باینری حسابی

    جاوا موارد زیر را تعریف می کند عملیات باینری حسابی:
    • اضافه کردن "+"؛
    • منها کردن "-"؛
    • ضرب " * "؛
    • تقسیم "/"؛
    • محاسبه باقیمانده تقسیم اعداد صحیح " % " (باقی مانده تقسیم عدد اول بر دوم را برمی گرداند و نتیجه همان علامت سود سهام خواهد بود) ، به عنوان مثال ، نتیجه عملیات 5٪ 3 می شود 2 و نتیجه عملیات (-7) %(-4) برابر با -3 خواهد بود. در جاوا، این عملیات برای متغیرهای واقعی (از نوع float یا double) نیز قابل استفاده است.
    نمونه های باینری عملیات حسابی: int x = 7، x1، x2، x3، x4، x5. x1 = x + 10 ; // x1 = 17 x2 = x - 8 ; // x2 = -1 x3 = x2 * x; // x3 = -7 x4 = x/ 4 ; // x4 = 1 (هنگام تقسیم اعداد صحیح // بخش کسری کنار گذاشته شده است) x5 = x%4 // x5 = 3 (باقی مانده از تقسیم// 7 در 4)

    عملیات بیتی

    • عملیات بیتی مقادیر عددی اصلی را به عنوان فیلدهای بیت در نظر گرفته و عملیات زیر را بر روی آنها انجام می دهد:
    • تنظیم ضربان به منموقعیت -امین فیلد نتیجه 1 است اگر هر دو بیت داخل باشند من-ام موقعیت عملوندها برابر با 1 یا 0 در غیر این صورت بیتی و (" & ") است.
    • تنظیم ضربان به منموقعیت -امین فیلد نتیجه 1 است اگر حداقل یک بیت در آن باشد منموقعیت -امین عملوندها 1 یا 0 است در غیر این صورت - به صورت بیتی OR (" | ");
    • تنظیم ضربان به منموقعیت -امین فیلد نتیجه 1 است اگر بیت ها وارد شوند منموقعیت های -امین عملوندها با یکدیگر برابر نیستند، یا با 0 در غیر این صورت - انحصاری بیتی OR (" ^ ");
    • با تعداد بیت هایی که توسط عملوند دوم تعیین می شود به سمت چپ بیت های فیلد عملوند اول تغییر دهید (بیت علامت عدد در این مورد تغییر نمی کند) - با در نظر گرفتن علامت "به سمت چپ حرکت کنید.<< ";
    • جابجایی به سمت راست بیت های فیلد عملوند اول با تعداد بیت های تعیین شده توسط عملوند دوم (بیت علامت عدد در این مورد تغییر نمی کند) - با در نظر گرفتن علامت به سمت راست حرکت کنید. " >>"؛
    • شیفت به سمت راست بیت های فیلد عملوند اول با تعداد بیت هایی که توسط عملوند دوم تعیین می شود (بیت علامت عدد نیز در این مورد جابه جا می شود) - به صورت بیتی بدون در نظر گرفتن ">> به سمت راست تغییر می کند. >" علامت بزنید.
    نمونه هایی از عملیات بیتی:
    1. به صورت بیتی و

      int x = 112 ; int y = 94 ; intz; z=x & y; // z=80: 00000000 00000000 00000000 01010000
    2. بیتی 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 01111110
    3. XOR بیتی

      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
    4. شیفت چپ با علامت

      int x = 31 , z; // x: 00000000 00000000 00000000 00011111 z=x<< 2 ; // z = 124: 00000000 00000000 00000000 01111100
    5. شیفت به راست با علامت

      int x = - 17 , z; z = x >> 2 ; // z = -5: 11111111 11111111 11111111 11111011
    6. بدون علامت به راست تغییر دهید

      int x = - 17 , z; // x: 11111111 11111111 11111111 11101111 z = x >>> 2 ; // z = 1073741819 // z: 00111111 11111111 11111111 11111011

    عملیات ترکیبی

    در جاوا برای عملیات حسابی باینری می توانید استفاده کنید ترکیب شدهعلائم عملیات (ترکیب): شناسه عملیات = عبارت این معادل عملیات زیر است: شناسه = عبارت شناسه عملیات مثالها:
    1. عبارت x += b به معنای x = x + b است.
    2. عبارت x -= b به معنای x = x - b است.
    3. عبارت x *= b به معنای x = x * b است.
    4. عبارت x /= b به معنای x = x / b است.
    5. عبارت x %= b به معنای x = x % b است.
    6. عبارت x &= b به معنای x = x & b است.
    7. عبارت x |= b به معنای x = x | ب
    8. عبارت x ^= b به معنای x = x ^ b است.
    9. بیان x<<= b означает x = x << b .
    10. عبارت x >>= b به معنای x = x >> b است.
    11. عبارت x >>>= b به معنای x = x >>> b است.

    عملیات مقایسه

    جاوا عملگرهای مقایسه زیر را تعریف می کند:
    • " == " (برابر)، " != " (برابر نیست)،
    • " > " (بزرگتر از)، " >= " (بزرگتر یا مساوی)،
    • " < " (меньше) " <= " (меньше или равно)
    دارای دو عملوند است و مقدار بولی مربوط به نتیجه مقایسه را برمی گرداند ( نادرستیا درست است، واقعی). توجه داشته باشید که هنگام مقایسه دو مقدار برای برابری در جاوا، مانند C و C++، نمادهای " == " (دو علامت مساوی متوالی بدون فاصله)، بر خلاف عملگر انتساب که از کاراکتر استفاده می کند. = ". استفاده از علامت "=" هنگام مقایسه دو مقدار یا باعث خطای زمان کامپایل می شود یا نتیجه نادرستی ایجاد می کند. نمونه هایی از عملیات مقایسه:بولی isEqual, isNonEqual, isGreater, isGreaterOrEqual, isLess, isLessOrEqual; int x1 = 5، x2 = 5، x3 = 3، x4 = 7؛ isEqual = x1 == x2; // isEqual = true isNonEqual = x1 != x2; // isNonEqual = false isGreater = x1 > x3; // isGreater = true // isGreaterOrEqual = true isGreaterOrEqual = x2 >= x3; isLess = x3< x1; // isLess = true isLessOrEqual = x1 <= x3; // isLessOrEqual = false

    عملیات بولی

    عملیات بولیبر روی متغیرهای بولی انجام می شود و نتیجه آنها نیز مقداری از نوع است بولی. جاوا عملیات بولی زیر را تعریف می کند:
    • نفی "!" – جایگزینی false با true یا بالعکس
    • عملگر AND "&" - نتیجه فقط در صورتی درست است که هر دو عملوند درست باشند، در غیر این صورت نتیجه نادرست است.
    • OR عملیات "|" - نتیجه فقط در صورتی درست است که حداقل یکی از عملوندها درست باشد، در غیر این صورت نتیجه نادرست است.
    • عملگر XOR "^" - نتیجه فقط در صورتی درست است که عملوندها با یکدیگر برابر نباشند، در غیر این صورت نتیجه نادرست است.
    عملگرهای "&"، "|" و "^" و همچنین عملگرهای بیتی مربوطه را می توان در عملگرهای انتساب ترکیبی استفاده کرد: " &= "، " |= " و " ^= " علاوه بر این، عملیات " =" برای عملوندهای بولی = " (برابر) و " != " (برابر نیست) قابل استفاده هستند. همانطور که از تعریف عملگرهای OR و AND می بینید، عملیات OR زمانی که عملوند اول true باشد، بدون توجه به مقدار عملوند دوم، به درستی ارزیابی می شود و زمانی که عملوند اول false باشد، عملیات AND به false ارزیابی می شود. صرف نظر از مقدار عملوند دوم. جاوا دو عملگر بولی دیگر را تعریف می کند: نسخه دوم عملگرهای بولی AND و OR، که به عنوان عملگرهای بولی اتصال کوتاه شناخته می شوند: اتصال کوتاه AND "&&" و اتصال کوتاه OR "||". هنگام استفاده از این عملیات، عملوند دوم به هیچ وجه ارزیابی نمی شود، که در مواردی مفید است که عملکرد صحیح عملوند سمت راست به درست یا نادرست بودن عملوند چپ بستگی دارد. نمونه هایی از عملیات بولی:بولی isInRange، isValid، isNotValid، isEqual، isNotEqual; int x = 8 ; isInRange = x > 0 && x< 5 ; // isInRange = false isValid = x >0 || x > 5 ; // isValid = true isNotValid = ! معتبر است؛ // isNotValid = false isEqual = isInRange == isValid; // isEqual = false // isNotEqual = true isNotEqual = isInRange != isValid

    عملیات مشروط

    عملگر شرطی به شکل 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&BA^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 = درست است
    یعنی اگر عملوند سمت چپ عبارت AND نادرست باشد، بدون در نظر گرفتن مقدار عملوند سمت راست، کل عبارت نادرست است. یعنی با یک عملوند چپ نادرست نیازی به محاسبه مقدار عملوند سمت راست نیست. به طور مشابه، اگر عملوند سمت چپ یک عبارت OR درست باشد، تمام عبارات بدون در نظر گرفتن مقدار عملوند سمت راست درست هستند، بنابراین ما نیازی به ارزیابی آن نداریم.

    یک مثال کد را در نظر بگیرید که اگر رشته غیر پوچ و بیش از 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 کاهش می دهد.
    نمونه هایی از عملیات واحد "+" و "-": int i = 3 , j, k; j=-i; // j = -3 k = + i; // k = 3 مثال عملیات مکمل بیتی: int a = 15 ; intb; b=~a; // b = -16 اعداد a و b int هستند، یعنی. به صورت داخلی توسط کامپیوتر به عنوان اعداد صحیح دودویی امضا شده با طول 32 بیت نمایش داده می شوند، بنابراین نمایش باینری a و b به این صورت است: در عدد a به 1 بیت در b و 1 بیت در a به بیت صفر تغییر می کند. نمایش دهدهی عدد b 16- خواهد بود. علائم عملگر افزایش و کاهش را می توان قبل یا بعد از یک متغیر قرار داد. این گزینه ها به ترتیب نامیده می شوند پیشوندو پسوندثبت این معاملات علامت پیشوندی عملگر، مقدار عملوند خود را برمی‌گرداند بعد ازارزیابی بیان با علامت گذاری پسوند، علامت عملیات در ابتدامقدار عملوند خود را برمی گرداند و تنها پس از آن افزایش یا کاهش را محاسبه می کند، به عنوان مثال: int x = 1 , y, z; y=++x; z= x++ ; به متغیر y مقدار 2 اختصاص داده می شود زیرا x ابتدا 1 افزایش می یابد و سپس نتیجه به متغیر y اختصاص می یابد. به متغیر z مقدار 1 اختصاص داده می شود زیرا z ابتدا یک مقدار و سپس x با 1 افزایش می یابد. در هر دو مورد، مقدار جدید x 2 خواهد بود. لازم به ذکر است که در جاوا بر خلاف زبان C می توان عملیات کاهش و افزایش را بر روی متغیرهای واقعی (از نوع float و double) نیز اعمال کرد. علائم دودویی عملیاتبه عملیات با نتیجه عددی و عملیات مقایسه تقسیم می شوند که نتیجه آنها یک مقدار بولی است.

    عملیات باینری حسابی

    جاوا موارد زیر را تعریف می کند عملیات باینری حسابی:
    • اضافه کردن "+"؛
    • منها کردن "-"؛
    • ضرب " * "؛
    • تقسیم "/"؛
    • محاسبه باقیمانده تقسیم اعداد صحیح " % " (باقی مانده تقسیم عدد اول بر دوم را برمی گرداند و نتیجه همان علامت سود سهام خواهد بود) ، به عنوان مثال ، نتیجه عملیات 5٪ 3 می شود 2 و نتیجه عملیات (-7) %(-4) برابر با -3 خواهد بود. در جاوا، این عملیات برای متغیرهای واقعی (از نوع float یا double) نیز قابل استفاده است.
    نمونه هایی از عملیات حسابی دودویی: int x = 7، x1، x2، x3، x4، x5. x1 = x + 10 ; // x1 = 17 x2 = x - 8 ; // x2 = -1 x3 = x2 * x; // x3 = -7 x4 = x/ 4 ; // x4 = 1 (هنگام تقسیم اعداد صحیح // بخش کسری کنار گذاشته شده است) x5 = x%4 // x5 = 3 (باقی مانده از تقسیم// 7 در 4)

    عملیات بیتی

    • عملیات بیتی مقادیر عددی اصلی را به عنوان فیلدهای بیت در نظر گرفته و عملیات زیر را بر روی آنها انجام می دهد:
    • تنظیم ضربان به منموقعیت -امین فیلد نتیجه 1 است اگر هر دو بیت داخل باشند من-ام موقعیت عملوندها برابر با 1 یا 0 در غیر این صورت بیتی و (" & ") است.
    • تنظیم ضربان به منموقعیت -امین فیلد نتیجه 1 است اگر حداقل یک بیت در آن باشد منموقعیت -امین عملوندها 1 یا 0 است در غیر این صورت - به صورت بیتی OR (" | ");
    • تنظیم ضربان به منموقعیت -امین فیلد نتیجه 1 است اگر بیت ها وارد شوند منموقعیت های -امین عملوندها با یکدیگر برابر نیستند، یا با 0 در غیر این صورت - انحصاری بیتی OR (" ^ ");
    • با تعداد بیت هایی که توسط عملوند دوم تعیین می شود به سمت چپ بیت های فیلد عملوند اول تغییر دهید (بیت علامت عدد در این مورد تغییر نمی کند) - با در نظر گرفتن علامت "به سمت چپ حرکت کنید.<< ";
    • جابجایی به سمت راست بیت های فیلد عملوند اول با تعداد بیت های تعیین شده توسط عملوند دوم (بیت علامت عدد در این مورد تغییر نمی کند) - با در نظر گرفتن علامت به سمت راست حرکت کنید. " >>"؛
    • شیفت به سمت راست بیت های فیلد عملوند اول با تعداد بیت هایی که توسط عملوند دوم تعیین می شود (بیت علامت عدد نیز در این مورد جابه جا می شود) - به صورت بیتی بدون در نظر گرفتن ">> به سمت راست تغییر می کند. >" علامت بزنید.
    نمونه هایی از عملیات بیتی:
    1. به صورت بیتی و

      int x = 112 ; int y = 94 ; intz; z=x & y; // z=80: 00000000 00000000 00000000 01010000
    2. بیتی 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 01111110
    3. XOR بیتی

      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
    4. شیفت چپ با علامت

      int x = 31 , z; // x: 00000000 00000000 00000000 00011111 z=x<< 2 ; // z = 124: 00000000 00000000 00000000 01111100
    5. شیفت به راست با علامت

      int x = - 17 , z; z = x >> 2 ; // z = -5: 11111111 11111111 11111111 11111011
    6. بدون علامت به راست تغییر دهید

      int x = - 17 , z; // x: 11111111 11111111 11111111 11101111 z = x >>> 2 ; // z = 1073741819 // z: 00111111 11111111 11111111 11111011

    عملیات ترکیبی

    در جاوا برای عملیات حسابی باینری می توانید استفاده کنید ترکیب شدهعلائم عملیات (ترکیب): شناسه عملیات = عبارت این معادل عملیات زیر است: شناسه = عبارت شناسه عملیات مثالها:
    1. عبارت x += b به معنای x = x + b است.
    2. عبارت x -= b به معنای x = x - b است.
    3. عبارت x *= b به معنای x = x * b است.
    4. عبارت x /= b به معنای x = x / b است.
    5. عبارت x %= b به معنای x = x % b است.
    6. عبارت x &= b به معنای x = x & b است.
    7. عبارت x |= b به معنای x = x | ب
    8. عبارت x ^= b به معنای x = x ^ b است.
    9. بیان x<<= b означает x = x << b .
    10. عبارت x >>= b به معنای x = x >> b است.
    11. عبارت x >>>= b به معنای x = x >>> b است.

    عملیات مقایسه

    جاوا عملگرهای مقایسه زیر را تعریف می کند:
    • " == " (برابر)، " != " (برابر نیست)،
    • " > " (بزرگتر از)، " >= " (بزرگتر یا مساوی)،
    • " < " (меньше) " <= " (меньше или равно)
    دارای دو عملوند است و مقدار بولی مربوط به نتیجه مقایسه را برمی گرداند ( نادرستیا درست است، واقعی). توجه داشته باشید که هنگام مقایسه دو مقدار برای برابری در جاوا، مانند C و C++، نمادهای " == " (دو علامت مساوی متوالی بدون فاصله)، بر خلاف عملگر انتساب که از کاراکتر استفاده می کند. = ". استفاده از علامت "=" هنگام مقایسه دو مقدار یا باعث خطای زمان کامپایل می شود یا نتیجه نادرستی ایجاد می کند. نمونه هایی از عملیات مقایسه:بولی isEqual, isNonEqual, isGreater, isGreaterOrEqual, isLess, isLessOrEqual; int x1 = 5، x2 = 5، x3 = 3، x4 = 7؛ isEqual = x1 == x2; // isEqual = true isNonEqual = x1 != x2; // isNonEqual = false isGreater = x1 > x3; // isGreater = true // isGreaterOrEqual = true isGreaterOrEqual = x2 >= x3; isLess = x3< x1; // isLess = true isLessOrEqual = x1 <= x3; // isLessOrEqual = false

    عملیات بولی

    عملیات بولیبر روی متغیرهای بولی انجام می شود و نتیجه آنها نیز مقداری از نوع است بولی. جاوا عملیات بولی زیر را تعریف می کند:
    • نفی "!" – جایگزینی false با true یا بالعکس
    • عملگر AND "&" - نتیجه فقط در صورتی درست است که هر دو عملوند درست باشند، در غیر این صورت نتیجه نادرست است.
    • OR عملیات "|" - نتیجه فقط در صورتی درست است که حداقل یکی از عملوندها درست باشد، در غیر این صورت نتیجه نادرست است.
    • عملگر XOR "^" - نتیجه فقط در صورتی درست است که عملوندها با یکدیگر برابر نباشند، در غیر این صورت نتیجه نادرست است.
    عملگرهای "&"، "|" و "^" و همچنین عملگرهای بیتی مربوطه را می توان در عملگرهای انتساب ترکیبی استفاده کرد: " &= "، " |= " و " ^= " علاوه بر این، عملیات " =" برای عملوندهای بولی = " (برابر) و " != " (برابر نیست) قابل استفاده هستند. همانطور که از تعریف عملگرهای OR و AND می بینید، عملیات OR زمانی که عملوند اول true باشد، بدون توجه به مقدار عملوند دوم، به درستی ارزیابی می شود و زمانی که عملوند اول false باشد، عملیات AND به false ارزیابی می شود. صرف نظر از مقدار عملوند دوم. جاوا دو عملگر بولی دیگر را تعریف می کند: نسخه دوم عملگرهای بولی AND و OR، که به عنوان عملگرهای بولی اتصال کوتاه شناخته می شوند: اتصال کوتاه AND "&&" و اتصال کوتاه OR "||". هنگام استفاده از این عملیات، عملوند دوم به هیچ وجه ارزیابی نمی شود، که در مواردی مفید است که عملکرد صحیح عملوند سمت راست به درست یا نادرست بودن عملوند چپ بستگی دارد. نمونه هایی از عملیات بولی:بولی isInRange، isValid، isNotValid، isEqual، isNotEqual; int x = 8 ; isInRange = x > 0 && x< 5 ; // isInRange = false isValid = x >0 || x > 5 ; // isValid = true isNotValid = ! معتبر است؛ // isNotValid = false isEqual = isInRange == isValid; // isEqual = false // isNotEqual = true isNotEqual = isInRange != isValid

    عملیات مشروط

    عملگر شرطی به شکل 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; سپس هیچ پیام خطایی وجود نخواهد داشت. لینک اول