Geben Sie eine implizite Konvertierung in C-Sprachausdrücken ein

伊谢尔伦
Freigeben: 2016-11-26 09:04:06
Original
1831 Leute haben es durchsucht

Schauen Sie sich zunächst das folgende Programm an, das ein Auszug aus „C Expert Programming“ ist:

#include <stdio.h>
int array[] = {23,34,12,17,204,99,16};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
 
int main(void)
{
    int d=-1,x;
    /*........*/
 
    if(d <= TOTALTOTAL_ELEMENTS - 2)
        x = array[d+1];
    /*........*/
    return 0;
}
Nach dem Login kopieren

Wenn es ein solches Programm gibt, werden Sie aus diesem Grund nie wissen, welchen Wert x hat Satz Die Zuweisungsanweisung x=array[d+1] wird überhaupt nicht ausgeführt. Was ist der Grund? Nach dem Debuggen wurde festgestellt, dass das Programm nach der Ausführung der if-Anweisung zur Beurteilung die Ausführung der nächsten Anweisung direkt überspringt. Lassen Sie uns den Grund unten analysieren, da der Rückgabewert von sizeof bei der Berechnung der Typgröße ein vorzeichenloser int-Typ ist und d ein vorzeichenbehafteter int-Typ ist. Wenn die Anweisung die Größe beider testet, wird d automatisch auf vorzeichenloses int aktualisiert und -1 konvertiert to unsigned int. Eine große positive Ganzzahl, daher ist der Wert des Ausdrucks immer falsch, sodass die nachfolgende Zuweisungsanweisung niemals ausgeführt wird. Dies ist ein Fehler, der durch die Typkonvertierung verursacht wird. Wenn Sie nicht vorsichtig sind, kann dies unvorhersehbare Folgen für das gesamte Projekt oder Projekt haben.

Typkonvertierung in Ausdrücken

Typkonvertierung umfasst erzwungene Typkonvertierung und implizite Konvertierung. Hier werden implizite Konvertierungen behandelt. Lassen Sie uns zunächst die Regeln der impliziten Typkonvertierung in traditionellem C (K&R C) verstehen:

Zuerst wird jeder Operand vom Typ char oder short int in den Typ int und jeder Typ float in double konvertiert Typ. . Wenn ein Operand vom Typ „double“ ist, wird auch der andere Operand in „double“ konvertiert, und das Berechnungsergebnis ist ebenfalls „double“. Wenn ein Operand vom Typ „long“ ist, wird der andere Operand ebenfalls in „long“ konvertiert, und das Berechnungsergebnis ist ebenfalls „double“. auch lang; wenn ein Operand vorzeichenlos ist, wird auch der andere Operand in vorzeichenlos konvertiert und das Berechnungsergebnis ist vorzeichenlos.

Im neuen Standard wurden jedoch einige Änderungen vorgenommen:

1. Alle char-, short int- und bit-Felder werden zuerst automatisch in int oder unsigned int konvertiert. Wenn int alle Werte des Quelltyps darstellen kann, wird es in int konvertiert, andernfalls wird es in vorzeichenloses int konvertiert.

2. Bei der Berechnung des Werts eines Ausdrucks wird der niedrige Typ (Datentyp mit einem kleinen Datenbereich, der dargestellt werden kann) normalerweise zuerst in einen hohen Typ konvertiert und nimmt dann an der Berechnung teil. Hier ist jedoch zu beachten, dass ein Ausdruck mit einem Float-Typ vor der Berechnung nicht unbedingt in einen Double-Typ konvertiert wird. Wenn der folgende Code vorhanden ist:

float f1,f2;
double d;
f1 = d*f2;
Nach dem Login kopieren

Wenn für die Berechnung einfache Genauigkeit verwendet wird, ist das Endergebnis dasselbe wie bei der Berechnung mit doppelter Genauigkeit, sodass f2 möglicherweise nicht konvertiert wird. Dies unterscheidet sich von herkömmlichem C, aber derzeit unterstützen nur wenige Compiler (VC unterstützt es nicht).

Wenn der Ausdruck vorzeichenlose und vorzeichenbehaftete Operanden enthält und ein Operand ein vorzeichenloser Long-Int ist, wird der andere Operand ebenfalls in einen vorzeichenlosen Long-Int umgewandelt. Wenn ein Operand ein Long-Int ohne Vorzeichen ist, ist der andere Operand ein vorzeichenloser Int . Wenn Long Int den Darstellungsbereich von Int ohne Vorzeichen ausdrücken kann, wird der andere Operand in Long Int ohne Vorzeichen konvertiert. Wenn ein Operand ein Int ohne Vorzeichen und der andere Operand ein Int ist, wird der andere Operand konvertiert zu unsigned int.

Sehen wir uns ein Beispiel an:

Angenommen, int ist 16 Bit und long int ist 32 Bit.

Also für -1L

Für -1L>1UL wird -1L in unsigned long int konvertiert, da -1L vom Typ „signed long int“ und 1UL vom Typ „unsigned long int“ ist.


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!