2017-03-21 4 views
0

Ich schreibe eine Funktion, die die Beschreibung einer Programmausführung ausdrucken soll. Eine Funktion in meinem Programm verwendet 0 als ein Signal für eine numerische Basis-10-Konvertierung.Fehler im C-Code-Fehler: Ausdruck ist nicht zuweisbar

ich mein Programm möchte freundlich Ausgabe haben, und dem Benutzer mitteilen, ob eine Zahl umgewandelt wurde zur Basis 10, statt das Programm zu lassen, sagen wurde die Zahl von Base umgewandelt 0.

Wenn ich versuche, zu kompiliere diesen Code, bekomme ich eine Fehlermeldung, die besagt, dass Ausdruck nicht zuweisbar ist.

Ich bin Kompilieren auf der Kommandozeile mit cc-Compiler

von Apple LLVM Version 7.3.0 (Klirren-703.0.29)

Jede Idee, was das bedeutet Fehler und wie zu korrigieren? Danke.

void foo(int base){ 

    int theBase; 

    base == 0 ? theBase = 10: theBase = base; 

    printf("%s%d\n", "The base is ", theBase) 
} 

Fehlermeldung:

error: expression is not assignable base == 0 ? theBase = 10: theBase = base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^

+0

Wenn eine Lösung gut genug für Sie ist, markieren Sie sie als die beste Antwort, um Ihre Frage zu schließen. – Ludonope

Antwort

1

Was Sie hier tun, ist eine bedingte Zuordnung.

Normalerweise kann man es so tun:

if (base == 0) 
    theBase = 10; 
else 
    theBase = base; 

Hier chosed Sie einen ternären Ausdruck zu verwenden. Es funktioniert ein bisschen wie eine If/Else-Struktur, aber es ist wirklich anders.

Das ternäre gibt einen Wert zurück, es wird nicht Code basierend auf einer Bedingung ausgeführt. Nein, es gibt einen Wert basierend auf einer Bedingung zurück.

Also hier, müssen Sie tun:

theBase = (base == 0 ? 10 : base); 

(die Klammern sind nicht erforderlich, aber es ist viel besser, Fehler zu vermeiden).

In der Tat können Sie ein ternären Code ausführen lassen, in einer mehr Art und Weise, wie eine Funktion der Rückkehr:

int my_function() 
{ 
    printf("Code executed\n"); 
    return (10); 
} 

/* ... */ 

theBase = (base == 0 ? my_function() : base); 

EDIT:

Und ja können Sie diesen Code verwenden:

base == 0 ? (theBase = 10) : (theBase = base); 

Aber es ist ziemlich nutzlos, ein ternäres in diesem Fall zu verwenden, weil Sie den Code noch duplizieren müssen.

1

Da Sie die lvalue brauchen, wo es auf der linken Seite des Ausdrucks, wie dieser

theBase = (base == 0) ? 10 : base; 

Hinweis gehört, wie der Compiler betrachtet

base == 0 ? theBase = 10 : theBase 

wie der "lvalue" in diesem Ausdruck wegen der Vorrangstellung des Operators.

Die ternary operator, ist das, ein Operator, also können Sie es nicht verwenden, um eine wenn Anweisung zu ersetzen.

0

sollten Sie

theBase = (base == 0 ? 10 : base); 

statt
base == 0 ? theBase = 10: theBase = base; 
0

Sie haben zu setzen Klammern um die Zuordnungen verwenden

base == 0 ? (theBase = 10) : (theBase = base); 

sonst Priorität Tricks auf Sie spielt. Verwenden Sie besser die idiomatische Syntax:

theBase = base ? base : 10; 
Verwandte Themen