جافا: إذا بدون قوسين مجعد ، والعلاقة للمتابعة

StackOverflow https://stackoverflow.com/questions/2061440

  •  20-09-2019
  •  | 
  •  

سؤال

لدي جزء رمز Java التالي

while (condition1){
    switch (someinteger){
        case 1:
            if(condition2) continue;
            // other stuff here
            break;
        // other cases here
    }
}

كل شيء على ما يرام. عندما أقوم بإنشاء ملف فئة ثم قم بإلغاء توحيده باستخدام أداة مجانية (JD-GUI) ، أحصل على الكود التالي.

while (condition1){
    switch (someinteger){
        case 1:
            if(!condition2);
            // other stuff here
            break;
        // other cases here
    }
}

لذلك يتغير if(condition2) continue; إلى if(!condition2);لم أتمكن من العثور على أي معلومات على الآخر إذا كان البيان (بدون أقواس). هل يمكن لأي شخص أن يشرح المنطق هنا؟ شكرا مقدما.

تحرير: لقد قمت ببعض الاختبارات ولم يعمل decompiler بشكل صحيح.

هنا هو الرمز من قبل:

public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException{
    int commentON=0, quoteON=0;
    int b1;
    while ((b1 = f1.read()) != -1){
        switch ((char) b1){
            case '\\':
                    if (commentON==0){
                            quoteON = 1;
                            break;
                    }
                    continue;
            case '\n':
                    if (commentON>0){ commentON=0; continue; }
                    break;
            case '%':
                    if (commentON>0) continue;
                    if (quoteON>0) { quoteON=0; break; }
                    commentON=2;
                    continue;
            default:
                    if (commentON>0) continue;
                    if (quoteON>0) quoteON=0;
                    break;
        }
        f2.write(b1);
    }
}

هنا هو الرمز المقلوب

public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException
{
int commentON = 0; int quoteON = 0;

while ((b1 = f1.read()) != -1)
{
  int b1;
  switch ((char)b1)
  {
  case '\\':
    if (commentON == 0);
    quoteON = 1;
    break;
  case '\n':
    if (commentON <= 0) break label109; commentON = 0; break;
  case '%':
    if (commentON <= 0);
    if (quoteON > 0) { quoteON = 0; break label109: }
    commentON = 2;
    break;
  }
  if (commentON <= 0);
  if (quoteON > 0) quoteON = 0;

  label109: f2.write(b1);
}
}

آسف لإزعاج الجميع. : P سأحاول حذف هذا السؤال إذا استطعت.

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

المحلول

من المستحيل أن يعيد تصميم بناء الجملة الأصلي الخاص بك لأنهم يعملون خارج تفسير المترجم للرمز الخاص بك.

تكتب رمز Java ، الذي يتم تجميعه إلى رمز البايت بواسطة برنامج التحويل البرمجي Java.

ثم يحاول decompiler إنشاء رمز Java من رمز البايت.

نظرًا لأن شظايا الكود متماثلان بشكل منطقي ، فقد قام Decompiler بعمله.

تحرير (شاهد تعليقك):

في الواقع ، من الممكن تمامًا (وهذا أمر شائع جدًا) أن Decompiler قد ارتكب خطأ.

البيان if(!condition2); في الأساس ليس له أي تأثير على الإطلاق (بشرط الشرط 2 هو في الواقع رمز منطقي وليس رمز زائف).

لذلك الأول لك //other stuff here ستتم معالجتها بغض النظر عن condition2 في النسخة غير المرغوب فيها.

هل أنت متأكد من أن الكود المنقلب يعمل بشكل صحيح؟

نصائح أخرى

إن عبارة if مع عدم وجود جسم ("بدون أقواس مجعد") هي مجرد عبارة فارغة إذا لم تنفذ أي رمز.

إنه تمثيل بديل/قانوني لنفس المنطق. لا تحافظ Decompilers على الرمز.

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