2013-04-19 4 views
9

Ich finde endlich einen Tippfehler, der dem folgenden Code ähnelt. Aber sollte der Compiler dies nicht erkennen (standardmäßig Optionen)?Warum erlaubt der Compiler das Initialisieren einer Variablen mit sich selbst?

#include <stdio.h> 

int main() 
{ 
    int c = c; 
    return printf("%d\n", c); 
} 


$ gcc --version   
gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3 
+10

Sie rufen ein undefiniertes Verhalten bei der Initialisierung auf; Der Compiler ist nicht erforderlich, um das Problem zu diagnostizieren oder zu definieren, was es tut, wenn es darauf stößt. –

+8

Ich würde meinen linken Schuh darauf wetten, dass wenn Sie Warnungen (-Wall in GCC) einschalten, wird es Sie warnen, wenn Sie dies tun. Versuche Warnungen nicht zu ignorieren ;-) – nothrow

+0

VC wird erkannt. – BLUEPIXY

Antwort

7

Ich sehe nicht, warum es nicht kompilieren würde. Die Definition erfolgt vor der Initialisierung. Natürlich ist diese Initialisierung sinnlos, aber es gibt keinen Grund, warum es nicht vom Standpunkt des Compilers aus funktionieren würde.

C hat nicht die gleichen Schutzarten wie moderne Sprachen wie C#. Der C# -Compiler würde einen Fehler geben, dass Sie eine nicht zugewiesene Variable verwenden. C ist es egal. Es schützt dich nicht vor dir selbst.

+5

Diese Initialisierung, keine Zuweisung. –

+5

Außerdem ist es möglich, auf die Variable für ihre Initialisierung zu verweisen * nützlich *, weil Sie ihre Adresse nehmen können, wie in 'int x = initialize_and_register (& x)'. (Diese Art von Aufruf würde typischerweise in einem Makro verpackt sein.) – user4815162342

+0

@ user4815162342 true, das macht offensichtlich Sinn. Ich hätte besser meine Worte wählen sollen :( – evanmcdonnal

-3

Wenn

int c; 
c = c; 

kompilieren, ich sehe nicht, warum int c = c; nicht kompiliert werden.

+7

Die beiden sehen täuschend ähnlich aus, sind aber eigentlich ganz anders: 'int c = ...' ist Initialisierung statt Zuweisung. Beispiel: 'int c [] = {1, 2, 3}; funktioniert, aber '{1, 2, 3}' ist im Kontext einer Zuweisung nicht gültig. – delnan

5

Es ist vollkommen legitim, eine Variable in ihrem eigenen Initialisierer zu verwenden. Betrachten wir eine verkettete Liste:

#include <stdio.h> 
struct node { struct node *prev, *next; int value; }; 
int main() { 
    struct node l[] = {{0, l + 1, 42}, {l, l + 2, 5}, {l, 0, 99}}; 
    for (struct node *n = l; n; n = n->next) 
     printf("%d\n", n->value); 
    return 0; 
} 

Im allgemeinen Diagnose, wenn ein Wert uninitialised verwendet wird, ist ein schwieriges Problem; Obwohl einige Compiler es in einigen Fällen erkennen können, ist es nicht sinnvoll, dies zu verlangen.

+0

Wie ist undefiniertes Verhalten legitim? – rubenvb

+8

Dies ist nicht ganz Initialisierung einer Variablen mit sich selbst, sondern eher ein Zeiger auf sich selbst, da 'l 'in diesem Zusammenhang in einen Zeiger' & [0] 'zerfällt. –

+0

Also ist das definiert? – this

Verwandte Themen