2017-08-21 6 views
-2

Est-ce que je deviens fou ici? L'opérateur ternaire dans cette fonction est de lancer le « lvalue nécessaire comme opérande gauche d'erreur d'affectation »lvalue nécessaire comme opérande gauche d'affectation avec opérateur bool et ternaire dans C

GSM_text_s *text_travers_find(const char* filename){ 

    //linked list traversal logic for finding and returning the desired node 

    text_tmp = text_head; 

    bool name; 

    if(text_tmp){ 
     (strcmp(filename, text_tmp->filename)) ? name = false : name = true; 

      while((!(name)) && (text_tmp->next)){ 
       text_tmp = text_tmp->next; 
      } 
    } else { 
     return text_tmp; 
    } 
    return text_tmp; 
} 

EDIT: Comme je suis chargé une mauvaise utilisation de l'opérateur ternaire.

Il devrait être:

name = (strcmp(filename, text_tmp->filename)) ? false : true; 

Une autre solution qui fonctionne, que j'ai découvert dans le cadre de ce poste étant répondu, est de tout simplement pas la valeur du nom:

(strcmp(filename, text_tmp->filename)) ? (!name) : name; 

Ce sera évidemment fonctionne uniquement si le nom est défini sur la valeur par défaut souhaitée.

Merci à tous, pour vos réponses, mises à jour !!

+0

utilisation ... parenthèses –

+1

Sidenote: Vous pouvez éviter complètement le nom ternaire '= strcmp (nom de fichier, text_tmp-> nom de fichier) == 0 ". – user694733

+0

... et le nom serait évalué à vrai si ces chaînes comparent la même chose. C'est vraiment beau. Va le garder dans le mien @ user694733 :) – MedicineMan25

Répondre

0

Vous avez une mauvaise utilisation si instruction inline-if.

name = (strcmp(filename, text_tmp->filename)) ? false : true; 

ou

//Using parenthesis 
(strcmp(filename, text_tmp->filename)) ? (name = false) : (name = true); 

La syntaxe est comme expliqué ci-dessous. Le résultat est affecté à val_true ou val_false selon l'expression expr résultat.

result = (expr) ? val_true : val_false; 
1

Alors que ce que vous aviez écrit semble que cela devrait fonctionner, vous traitez plus comme un if/else qu'elle ne l'est en réalité. Il est vraiment juste une expression si vous devez déplacer l'affectation à l'extérieur de celui-ci comme celui-ci

name = (strcmp(filename, text_tmp->filename) ? false : true); 
+2

'expression? false: true' est également appelé '! expression'. – Art