2017-03-21 16 views
0

J'écris une fonction qui est supposée imprimer la description d'une exécution de programme. Une fonction dans mon programme utilise 0 comme un signal pour une conversion numérique base-10.Erreur dans l'erreur de code C: l'expression n'est pas assignable

Je voudrais que mon programme pour avoir la sortie amicale, et indiquer à l'utilisateur si un numéro a été converti en base 10, au lieu de laisser le programme dire le nombre a été converti de la base 0.

Lorsque je tente de compiler ce code, j'obtiens un message d'erreur qui dit 'l'expression n'est pas assignable'.

Je compile sur la ligne de commande avec le compilateur cc

Apple version 7.3.0 LLVM (clang-703.0.29)

Toute idée de ce que signifie cette erreur et comment corriger? Merci.

void foo(int base){ 

    int theBase; 

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

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

message d'erreur:

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

+0

Si une solution est assez bonne pour vous la marquez comme la meilleure réponse pour fermer votre question. – Ludonope

Répondre

1

Ce que vous faites ici est une affectation conditionnelle.

En général, vous pouvez le faire comme ça:

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

Ici vous chosed à utiliser une expression ternaire. Cela fonctionne un peu comme une structure if/else, mais c'est vraiment différent. Le ternaire renvoie une valeur, il n'est pas fait pour exécuter du code en fonction d'une condition. Non, il renvoie une valeur basée sur une condition.

donc ici, vous devez faire:

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

(entre parenthèses ne sont pas nécessaires, mais il est beaucoup mieux pour éviter les erreurs).

En fait, vous pouvez faire un code d'exécuter ternaire, de manière multiple, comme le retour d'une fonction:

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

/* ... */ 

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

EDIT:

Et oui, vous pouvez utiliser ce code:

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

Mais il est inutile d'utiliser un ternaire dans ce cas, car vous devez toujours dupliquer le code theBase = X.

1

Parce que vous avez besoin du lvalue, où il appartient, sur le côté gauche de l'expression, comme celui-ci

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

Notez comment le compilateur considère

base == 0 ? theBase = 10 : theBase 

comme le "lvalue" dans cette expression, en raison de la priorité de l'opérateur. Le ternary operator est un opérateur, donc vous ne pouvez pas l'utiliser pour remplacer une instruction si.

0

Vous devez utiliser

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

au lieu de

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

Vous devez mettre entre parenthèses autour des missions

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

priorité d'autre vous joue des tours. Encore mieux, utilisez la syntaxe idiomatique:

theBase = base ? base : 10;