لماذا شار + شار آخر = رقم غريب
-
19-09-2019 - |
سؤال
إليك مقتطف التعليمات البرمجية:
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 - ثم تمت إضافته معا.