warning C4554: '>>': check operator precedence



  • Hi, wer kann mir sagen wie ich in folgender Zeile die Klammern setzen muss, ohne dass ich die Logik verändere:

    // All months have less than 32 days, so n >> 5 is a good conservative
    // estimate for the month
    int m = n >> 5 + 1;
    

    Ohne Klammern bekomme ich immer eine Warnung

    warning C4554: '>>': check operator precedence for possible error; use parentheses to clarify precedence



  • Darf man fragen, warum nicht einfach durch 32 geteilt wird? Obiger Code ist zu n >> 6 äquivalent.



  • "Ohne die Logik zu verändern" müssen die Klammern so aussehen:

    int m = n >> (5 + 1);
    

    Das ist aber wahrscheinlich nicht das was du erreichen möchtest, daher auch die Warnung.
    Als Programmierer solltest du eigentlich selbst am besten wissen, wie du die Klammern setzt, da nur du die Intention des Code kennst.

    Vermutlich willst du folgendes schreiben:

    int m = (n >> 5) + 1;
    

    ... da du das ansonsten wohl eher als (n >> 6) formuliert hättest.

    siehe auch: http://en.cppreference.com/w/cpp/language/operator_precedence

    Finnegan



  • Ich hätte auch

    int m = (n >> 5) + 1;
    

    vermutet wegen der Schreibweise.

    Die gesamte Funktion sieht so aus:

    // Returns a given date part of this DateTime. This method is used
            // to compute the year, day-of-year, month, or day part.
            private int GetDatePart(int part) {
                Int64 ticks = InternalTicks;
                // n = number of days since 1/1/0001
                int n = (int)(ticks / TicksPerDay);
                // y400 = number of whole 400-year periods since 1/1/0001
                int y400 = n / DaysPer400Years;
                // n = day number within 400-year period
                n -= y400 * DaysPer400Years;
                // y100 = number of whole 100-year periods within 400-year period
                int y100 = n / DaysPer100Years;
                // Last 100-year period has an extra day, so decrement result if 4
                if (y100 == 4) y100 = 3;
                // n = day number within 100-year period
                n -= y100 * DaysPer100Years;
                // y4 = number of whole 4-year periods within 100-year period
                int y4 = n / DaysPer4Years;
                // n = day number within 4-year period
                n -= y4 * DaysPer4Years;
                // y1 = number of whole years within 4-year period
                int y1 = n / DaysPerYear;
                // Last year has an extra day, so decrement result if 4
                if (y1 == 4) y1 = 3;
                // If year was requested, compute and return it
                if (part == DatePartYear) {
                    return y400 * 400 + y100 * 100 + y4 * 4 + y1 + 1;
                }
                // n = day number within year
                n -= y1 * DaysPerYear;
                // If day-of-year was requested, return it
                if (part == DatePartDayOfYear) return n + 1;
                // Leap year calculation looks different from IsLeapYear since y1, y4,
                // and y100 are relative to year 1, not year 0
                bool leapYear = y1 == 3 && (y4 != 24 || y100 == 3);
                int[] days = leapYear? DaysToMonth366: DaysToMonth365;
                // All months have less than 32 days, so n >> 5 is a good conservative
                // estimate for the month
                int m = n >> 5 + 1;
                // m = 1-based month number
                while (n >= days[m]) m++;
                // If month was requested, return it
                if (part == DatePartMonth) return m;
                // Return 1-based day-of-month
                return n - days[m - 1] + 1;
            }
    


  • kein C++



  • Wollte gerade schreiben, was das denn für ein Geraffel ist mit dem "part"-Parameter und dem wahrscheinlich fehlerhaften Shift - ansonsten sieht der Code auch so wuselig aus, dass ich erstmal skeptisch wäre.
    Dann sehe ich jedoch, dass es sich um Code von Microsoft aus der C#-Standardbibliothek handelt (http://referencesource.microsoft.com/mscorlib/system/datetime.cs.html), also muss es sich wohl um Qualitätssoftware handeln. Mein Fehler 🙄.

    Soweit ich weiss haben C# und C++ die gleiche Operator-Rangfolge bezüglich + und >> , daher ist int m = n >> (5 + 1); wohl die richtige Wahl, wenn du dasselbe Verhalten der Funktion anstrebst.

    Finnegan



  • Ja, kein C++, aber das Ziel ist es.
    Alles klar, danke euch.



  • Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply