سؤال

إليك مقتطف التعليمات البرمجية:

public static void main (String[]arg) 
{
    char ca = 'a' ; 
    char cb = 'b' ; 
    System.out.println (ca + cb) ; 
}

الإخراج هو:

195

لماذا هذا هو الحال؟ أعتقد ذلك 'a' + 'b' سيكون كذلك "ab" , "12" ، أو 3.

ماذا يجري هنا؟

هل كانت مفيدة؟

المحلول

+ من اثنان char هو إضافة حسابية، وليس سلسلة سلسلة. عليك أن تفعل شيئا مثل "" + ca + cb, ، او استعمل String.valueOf و Character.toString طرق للتأكد من أن واحد على الأقل من معاملات + هو String للمشغل أن يكون سلسلة سلسلة.

JLS 15.18 المشغلين المادتان

إذا كان نوع أي من المعامل + المشغل هو String, ثم العملية هي سلسلة سلسلة.

خلاف ذلك، نوع كل من معاملات + يجب أن يكون المشغل نوعا قابل للتحويل إلى نوع رقمي بدائي، أو يحدث خطأ في وقت الترجمة.

أما لماذا تحصل على 195، فهذا لأنه في ASCII، 'a' = 97 و 'b' = 98, ، و 97 + 98 = 195.


هذا ينفذ الأساسية int و char يصب.

 char ch = 'a';
 int i = (int) ch;   
 System.out.println(i);   // prints "97"
 ch = (char) 99;
 System.out.println(ch);  // prints "c"

يتجاهل هذا مسألة مخططات ترميز الأحرف (التي يجب ألا تقلقها للمبتدئين ... حتى الآن!).


كملاحظة، أشار جوش بلوخ إلى أنه من المؤسف أن + مزيد من الزائد لكل من سلسلة سلسلة السلسلة والأعتام ("قد يكون ذلك خطأ في التحميل الزائد + المشغل لسلسلة السلسلة." - جافا الألغاز, ، لغز 11: الضحك الأخير). الكثير من هذه الأنواع من الارتباك قد تم تجنبه بسهولة من خلال الحصول على رمز مميز مختلف للحصول على سلسلة سلسلة.


أنظر أيضا

نصائح أخرى

أنا لا أتحدث جافا، ولكن 195 هو 97 + 98 = رموز ASCII ل a و b. وبعد من الواضح ذلك، ca و cb يتم تفسيرها على أنها قيمها الصحيحة، ربما بسبب + إضافة والتي لا يبدو أنها تؤدي إلى سلسلة سلسلة تلقائيا.

إذا كنت ترغب في الحصول على سلسلة نتيجة للمشغل + لديك لاستخدام سلسلة نوع كمعاملات.

يجب ان تكتب:

public static void main (String[]arg) 
{
    String ca = "a" ; 
    String cb = "b" ; 
    System.out.println (ca + cb) ; 
}

يتصرف المشغل + المطبق على شركة Char Aburands كمبلغ حسابي.

ال + المشغل لا يعمل عبر أحرف كما يفعل على سلاسل. ما يحدث هنا هو ذلك a و b يتم وضعها إلى CodePoints Integer ASCII الخاصة بهم - 97 و 98 - ثم تمت إضافته معا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top