Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erhalte ich in C die Warnung „Vergleich zwischen vorzeichenbehafteten und vorzeichenlosen Ganzzahlausdrücken“?

Warum erhalte ich in C die Warnung „Vergleich zwischen vorzeichenbehafteten und vorzeichenlosen Ganzzahlausdrücken“?

Barbara Streisand
Barbara StreisandOriginal
2024-11-10 13:00:03731Durchsuche

Why do I get a

Warnung: Vergleich zwischen vorzeichenbehafteten und vorzeichenlosen Ganzzahlausdrücken

Einführung

Während der Arbeit an der Übung 2-3 von „Accelerated C“ stieß ein Benutzer auf eine Compiler-Warnung: „Vergleich zwischen signiert und vorzeichenlose Ganzzahlausdrücke. Dieses Problem tritt auf, wenn vorzeichenbehaftete Ganzzahlen (int) mit string::size_type verglichen werden, einem Datentyp, der häufig für Zeichenfolgenlängen verwendet wird.

Ursache der Warnung

Die Warnung tritt auf weil vorzeichenbehaftete und vorzeichenlose Ganzzahltypen unterschiedliche Bereiche haben. Beim Vergleich dieser Typen kann das Ergebnis unerwartet sein. Compiler geben diese Warnung aus, um Programmierer auf die Möglichkeit verwirrender Ergebnisse aufmerksam zu machen.

Empfohlene Vorgehensweise

Um dieses Problem zu vermeiden, ist es ratsam, explizit anzugeben, ob ganze Zahlen vorzeichenbehaftet sind oder ohne Vorzeichen. Wenn Sie Ganzzahlen mit Zeichenfolgenlängen oder anderen vorzeichenlosen Werten vergleichen, deklarieren Sie die Ganzzahlen als unsigned int oder size_t, damit sie dem zu vergleichenden Datentyp entsprechen. Dadurch wird sichergestellt, dass der Vergleich die beabsichtigten Ergebnisse liefert.

Beispielcode

Im bereitgestellten Code sollte padtopbottom als unsigned int deklariert werden, um mit der Variablen string::size_type übereinzustimmen c:

unsigned int padtopbottom;
cin >> padtopbottom;

unsigned int padsides;
cin >> padsides;

if (r == padtopbottom + 1 && c == padsides + 1) {
    // ...
}

Zusätzlich Hinweise

  • Indem Sie die Ganzzahlen als vorzeichenlos deklarieren, vermeiden Sie die Möglichkeit eines unerwarteten Verhaltens beim Vergleich mit Zeichenfolgenlängen.
  • Der genaue Typ, der für den Vergleich verwendet werden soll, hängt von der ab Datentyp, mit dem Sie arbeiten.
  • Im Fall von Linux Mint wird string::size_type normalerweise als unsigned int definiert, was den Vergleich sicher macht. Es ist jedoch immer noch eine gute Praxis, die Ganzzahlen explizit zu deklarieren.
  • Das Buch „Accelerated C“ behandelt zwar Themen im Zusammenhang mit der Datentypverarbeitung, bietet jedoch möglicherweise keine umfassende Erklärung zu Vergleichen zwischen vorzeichenbehafteten und vorzeichenlosen Typen.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich in C die Warnung „Vergleich zwischen vorzeichenbehafteten und vorzeichenlosen Ganzzahlausdrücken“?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn