Waarschuwing van de compiler – stel haakjes voor rond de opdracht die als waarheidswaarde wordt gebruikt

Als ik het onderstaande stukje code probeer te compileren, krijg ik deze waarschuwing:

warning: suggest parentheses around assignment used as truth value

Waarom gebeurt dit? Dit is een vrij algemeen idioom, geloof ik. Ik gebruik zelfs zoiets eerder in mijn code.

struct PIDList* 
getRecordForPID(struct PIDList* list, pid_t pid) {
    while(list = list->next)
        if (list->pid == pid)
            return list;
    return NULL;
}

Antwoord 1, autoriteit 100%

Wees expliciet – dan zal de compiler niet waarschuwen dat je misschien een fout hebt gemaakt.

while ( (list = list->next) != NULL )

of

while ( (list = list->next) )

Op een dag zul je blij zijn dat de compiler je vertelde dat mensen doendie fout maken 😉


Antwoord 2, autoriteit 73%

Hoewel dat specifieke idioom gebruikelijk is, is het nog gebruikelijker dat mensen =gebruiken als ze ==bedoelen. De conventie als je echt de =bedoelt, is om een extra laag haakjes te gebruiken:

while ((list = list->next)) { // yes, it's an assignment

Antwoord 3, autoriteit 25%

Het is slechts een ‘veiligheidswaarschuwing’. Het is een relatief veelvoorkomend idioom, maar ook een relatief veel voorkomende fout als je ==erin wilde hebben. U kunt de waarschuwing laten verdwijnen door nog een set haakjes toe te voegen:

while ((list = list->next))

Other episodes