Per què no posar assignacions dins d’un if en C

novembre 4th, 2025

La importància de la sintaxi i de la claredat en la programació

Quan aprenem a programar en C, una de les primeres coses que descobrim és la seua rigidesa: cada caràcter compta. No és un llenguatge que “interprete la intenció” del programador, sinó que executa exactament el que s’ha escrit, ni més ni menys.
Aquesta precisió és una de les grans fortaleses del C, però també una de les seues trampes més habituals. I pocs exemples ho il·lustren millor que el famós cas del if amb una assignació dins de la condició.

La sintaxi d’un if: aparentment simple

La forma bàsica d’un if en C és directa:

if (condició) {
    // Codi que s’executa si la condició és certa
}

Fins ací tot bé. El que sovint oblidem és què és una “condició” en C. A diferència d’altres llenguatges més moderns, C no exigeix que la condició siga estrictament booleana (true o false). Qualsevol expressió que tinga un valor numèric pot usar-se com a condició:

  • Si l’expressió val zero → es considera falsa.
  • Si val qualsevol altre nombre → es considera certa.

Aquesta flexibilitat, que en el seu moment tenia sentit per a fer el llenguatge més eficient, és també font d’errors subtils i difícils de detectar.

El parany de l’assignació dins d’un if

Mirem aquest exemple senzill:

int a = 0;
if (a = 5) {
    printf("Condició certa!\n");
}

A primera vista, podria semblar que volem comprovar si a és igual a 5. Però no és això el que passa.
L’expressió a = 5 és una assignació, no una comparació. I en C, les assignacions són expressions vàlides que retornen el valor assignat —en aquest cas, el valor 5.

Així que el if no comprova res: assigna 5 a a, i després avalua el resultat de l’assignació. Com que 5 és diferent de zero, la condició és certa, i el bloc del if s’executa.

El compilador no ens dirà res, perquè la sintaxi és perfecta.
L’error no és sintàctic, sinó semàntic: el codi “funciona”, però fa una cosa diferent del que volíem.

Per què la sintaxi importa tant

Aquest cas demostra una lliçó fonamental: la sintaxi és el contracte entre el programador i la màquina.
Cada símbol, cada parèntesi i cada signe d’igualtat té un significat precís. No hi ha marge per a la interpretació.

Quan escrivim ==, estem demanant una comparació; quan escrivim =, estem assignant. Per a un humà, pot ser una diferència mínima; per a la màquina, és un canvi total de comportament.

El llenguatge C no “sospita” que ens hem equivocat. Si la sintaxi és correcta, assumeix que sabem exactament què estem fent. D’ací la importància de ser extremadament curosos: un error tipogràfic pot transformar la lògica d’un programa sense provocar cap error de compilació ni cap avís, i això pot portar hores —o dies— de depuració.

Un exemple més subtil

Imagina que tens aquest fragment de codi en un programa més gran:

int a = obtenir_valor();
if (a = comprovar_resultat()) {
    processar_dades();
}

Pot semblar inofensiu, però si comprovar_resultat() retorna 0 o 1 (com sol passar en moltes funcions de comprovació), el if assignarà eixe valor a a i després l’avaluarà.
Això pot alterar el flux de control i, a més, modificar el valor de a de manera inesperada, creant un efecte col·lateral que pot afectar altres parts del programa.

Aquest tipus d’errors són especialment traïdors perquè el codi es compila correctament, s’executa i sembla funcionar… fins que deixa de fer-ho quan menys t’ho esperes.

Bones pràctiques per evitar aquest tipus d’errors

  1. Activa sempre els avisos del compilador.
    Per exemple, amb gcc -Wall, el compilador advertirà que has fet una assignació dins d’un if. No ignores mai els avisos: són la teua primera línia de defensa.
  2. Evita combinacions d’assignació i condició en una mateixa expressió.
    Encara que siga sintàcticament vàlid escriure if ((a = func())), és molt més llegible (i segur) fer-ho en dues línies: a = func(); if (a) { ... }
  3. Fes servir convencions visuals.
    Algunes persones col·loquen la constant a l’esquerra de la comparació (if (5 == a)) per evitar confusions: si s’oblida un =, el compilador donarà error (lvalue required as left operand of assignment).
    No és una obligació, però pot ajudar.
  4. Revisa el codi amb calma.
    La major part dels errors de sintaxi “correcta però semànticament errònia” provenen de pressa o de distracció. Una lectura atenta abans de compilar pot estalviar molt de temps.

Una reflexió sobre la sintaxi

En ciències de la computació, la sintaxi no és només una qüestió d’estil o de convenció: és l’estructura formal que defineix el significat d’un programa.
Cada llenguatge estableix unes regles precises que permeten que una màquina interprete les nostres instruccions sense ambigüitat.

Quan un codi és sintàcticament correcte, la màquina pot executar-lo.
Quan és semànticament correcte, fa el que volíem que fera.
L’art de programar consisteix a aconseguir totes dues coses alhora.

En conclusió

Una assignació dins d’un if no és un error tècnic, però gairebé sempre és un error d’intenció. És el tipus d’error que naix d’una sintaxi aparentment ben escrita però conceptualment equivocada.
El llenguatge C ens recorda constantment que la precisió és el fonament de la programació: un símbol fora de lloc pot canviar completament el sentit d’un programa.

La sintaxi no és un obstacle; és la gramàtica que dóna forma al pensament computacional. Escriure codi és, en el fons, escriure amb exactitud matemàtica.
Per això, abans de compilar, val la pena mirar dues vegades cada signe d’igualtat: potser hi ha un sol caràcter que separa un programa correcte d’un comportament imprevisible.