C/Operadores

En Galilibros, o Wikibooks en galego.
< C
C
← Volver a Tamaño Operadores Seguir con Instrucións de control


A linguaxe de programación C conta con expresións (operadores, operandos ou conxuntos dos mesmos) de todo tipo. A continuacións lístanse todas estas expresións, agrupadas segundo a prioridade que se lles dá á hora de traballar. Cómpre salientar ademais que, ante dúas expresións coa mesma prioridade, o cálculo efectúase de esquerda a dereita.

Expresións de primeiro nivel[editar]

Identificador[editar]

Sempre que se declarase previamente designando unha variable ou unha función, un identificador será unha expresión de primeiro nivel.

Constante literal[editar]

As constantes literais son expresións de primeiro nivel.

Cadea de caracteres[editar]

As cadeas de caracteres son expresións de primeiro nivel.

Parénteses[editar]

Unha expresión entre parénteses é unha expresión de primeiro nivel. É dicir, os parénteses utilízanse para converter en expresións de primeiro nivel aquelas que conteñen, dándolles así prioridade sobre outras expresións.

Os seus símbolos son de sobra coñecidos: «(» é o paréntese inicial e «)» o final.

Expresións de segundo nivel[editar]

Son expresións de segundo nivel o conxunto das expresións de primeiro nivel e as seguintes:

Delimitador dunha matriz[editar]

Un delimitador dunha matriz é unha expresión formada por: unha expresión de segundo nivel seguida doutra expresión entre corchetes («[» e «]»). A primeira expresión será dun tipo “apuntador” ─unha matriz ou un punteiro─, e a segunda de tipo enteiro. O resultado será do tipo ao que apuntase a expresión de tipo “apuntador”.

Un delimitador dunha matriz fai referencia a un elemento de dita matriz, e nos casos en que haxa delimitadores de matriz sucesivos (como por exemplo: identificador[3][7]) estaremos falando de matrices de varias dimensións.

Chamada a unha función[editar]

Unha chamada a unha función é unha expresión de segundo nivel seguida de parénteses que poden conter ou non unha lista de argumentos.

Elemento dunha agrupación[editar]

Un elemento dunha agrupación ─unha estrutura ou unha unión─ sinálase mediante unha expresión de segundo nivel ─que se corresponde cunha agrupación─ seguida dun punto, «.», e este seguido dun identificador ─o identificador do elemento da agrupación─. Se a expresión de segundo nivel é un punteiro a unha agrupación en vez dunha agrupación directamente, o punto substituirase por unha “frecha”: «->».

Incremento e redución[editar]

Un incremento ou redución é o que se coñece como unha “sentencia operativa”. É de segundo nivel cando está formado por unha expresión de segundo nivel ─unha variable─ seguida dun operador de incremento, «++», ou un de redución, «--». Se o operador está antes da expresión en vez de despois, xa se trataría o conxunto dunha expresión de terceiro nivel.

Este tipo de expresión conforma de por si unha sentencia, é dicir, non tería sentido mesturar un incremento ou redución con outros operadores nunha sentencia, porque forman xa de por si unha sentencia.

Este tipo de expresión de segundo nivel implica que a expresión de segundo nivel orixinal verá o seu valor modificado. Segundo se utilice o operador de incremento ou o de redución, esta modificación será un aumento ou unha diminución nunha unidade do valor orixinal, respectivamente.

E segundo a posición do operador con respecto da expresión de segundo nivel ─diante ou detrás─, será distinto o valor da expresión de segundo nivel resultante. Se o operador está antes da expresión de segundo nivel, a expresión resultante da combinación do operador e a expresión de segundo nivel terá por valor o desta última incrementado ou reducido nunha unidade. Porén, se o operador está despois da expresión de segundo nivel, o valor desta ─sen cambios─ será o valor da expresión resultante (por exemplo, o valor de a é o mesmo que o de a++), e o cambio aplicarase despois de utilizar a expresión.

A mellor forma de entendelo é mediante un exemplo práctico:

  // Estas tres expresións teñen para «a» o mesmo resultado:
  a = a + 1;
  a++
  ++a
  // Porén, as seguintes expresións non significan o mesmo para «b»:
  b = a++ // Incremento posterior, equivale a: b = a; a = a + 1;
  b = ++a // Incremento previo, equivale a: a = a + 1; b = a;

Téñase en conta que estas expresións non melloran o rendemento do programa, son simplemente formas alternativas de expresar unha operación ou serie de operacións. É dicir, en lugar de usar as expresións de incremento e redución pode perfectamente usarse unha equivalencia ─como as dos comentarios do exemplo anterior─.

Algunhas persoas poden considerar estas expresións complicadas de entender (habitual cando se está comezando a aprendizaxe da linguaxe), e usar outras sentencias equivalentes. Así e todo, úsense ou non estas formas, cómpre coñecelas para entendelas en caso de ler códigos alleos que as conteñan.

Incremento e redución nunha instrución while[editar]

Cómpre asemade saber que expresar da seguinte forma un ciclo while:

while(variable[indice++]);

equivale a estoura expresión dun ciclo for:

for(i=0;variable[indice];indice++);

Expresións de terceiro nivel[editar]

Son expresións de terceiro nivel o conxunto das expresións de segundo nivel e as seguintes:

Incremento e redución[editar]

Son de terceiro nivel cando o operador vai despois, como xa se explicou antes. Remítase alí para entender en que consisten ou o seu funcionamento.

Enderezo[editar]

O operador de enderezo, se se sitúa diante dunha variable calquera ─expresión de cuarto nivel─, indica que se traballa co enderezo de memoria en que esta se garda en lugar de traballar co seu valor.

O seu símbolo é: «&».

Apuntado[editar]

O operador de apuntado, precedendo a un punteiroexpresión de cuarto nivel─, indica que se traballa co contido do espazo de memoria ao que apunta, e non co contido do punteiro. É dicir, traballarase co valor da variable á que apunta o punteiro en vez de co valor do punteiro.

O seu símbolo é o asterisco: «*».

Complemento a dous[editar]

O complemento a dous é o que popularmente se coñece como “negación”. Para saber en que consiste, búsquese un libro de matemáticas fundamentais.

O seu símbolo é o guión curto, «-», e colócase precedendo un valor ou unha variable ─expresión de cuarto nivel─.

Signo positivo[editar]

O signo positivo é un operador que non cambia nada.

O seu símbolo é «+», e colócase precedendo un valor ou unha variable ─expresión de cuarto nivel─.

Negación lóxica[editar]

O seu símbolo é un peche de exclamación, «!», e colócase precedendo un valor ou unha variable ─expresión de cuarto nivel─. Equivale a unha equiparación lóxica do valor ao que precede a cero.

Por exemplo, (!variable) é o mesmo que (0==variable).

Complemento a un[editar]

Por non estenderse de máis na explicación de que consiste, trátase dunha inversión a nivel binario dos números. Por exemplo, o complemento a dous de 10011100 sería 01100011.

O seu símbolo é un til como o do ñ, «~», e colócase precedendo un valor ou unha variable ─expresión de cuarto nivel─.

sizeof[editar]

Aínda que parece unha función, sizeof() é un operador de C. Este operador permite coñecer a cantidade de bytes que ocupa en memoria unha expresión de terceiro nivel ou un tipo de dato, indicados entre os seus parénteses. En ambos casos, a expresión resultante será de terceiro nivel.

A súa sintaxe é a seguinte:

sizeof variable;
sizeof(tipo);

O operador devolve o valor da cantidade de bytes co tipo size_t ─definido no ficheiro de cabeceira stddef.h─, que so admite valores positivos (números naturais).

Expresións de cuarto nivel[editar]

Son expresións de cuarto nivel o conxunto das expresións de terceiro nivel e as seguintes:

Moldes[editar]

Os moldes seguidos de expresións de cuarto nivel son en conxunto expresións de cuarto nivel.

Operadores aritméticos[editar]

Á hora de realizar operacións aritméticas, hai que ter en conta dúas cousas: (1) a orde de prioridade dos operadores, que é similar á das matemáticas, e (2) o tipo de dato dos valores que forman parte das expresións aritméticas.

A continuación lístanse os operadores aritméticos segundo a súa prioridade, sendo prioritarios os primeiros sobre os que lles seguen:

  1. Multiplicación, división e resto.
  2. Suma e resta.

Multiplicación[editar]

Para saber en que consiste a multiplicación, búsquese un libro de matemáticas fundamentais.

O seu símbolo é o asterisco, «*», e colócase entre dous valores ou variables para calcular o seu produto.

División[editar]

Para saber en que consiste a división, búsquese un libro de matemáticas fundamentais.

O seu símbolo é a barra inclinada, «/», que se sitúa entre dous valores ou variables a dividir, sendo o primeiro valor o dividendo e o segundo o divisor.

Resto[editar]

O resto é a cantidade que sobra ao realizar unha división entre dous números enteiros.

O seu símbolo é o de porcentaxe, «%», e sitúase entre dous valores para saber cal sería o resto froito da súa división.

Non fai falla que tanto dividendo coma divisor sexan números enteiros, pero é necesario que polo menos un dos dous o sexa, dado que os números reais non teñen resto.

Ao traballar co resto hai que ter coidado, xa que non actúa exactamente como se podería esperar en Matemáticas. Por exemplo: (-5) % 2 = -1 (non 1 como podería esperarse). O resto das divisións de enteiros é un enteiro, e o das divisións de enteiros negativos entre enteiros positivos redondea cara o cero en vez de redondear cara abaixo. Para que se comprenda, nada como outro exemplo: (-5) % 3 = -1 (non -2, como podería esperarse).

Este operador resulta moi útil ao traballar con instrucións de control. Permite, por exemplo, comprobar nunha división se o dividendo é un múltiplo do divisor.

Suma[editar]

Para saber en que consiste a suma, búsquese un libro de matemáticas fundamentais.

O seu símbolo é «+», e colócase entre dous valores ou variables para sumar ambos os dous valores.

Resta[editar]

Para saber en que consiste a resta, búsquese un libro de matemáticas fundamentais.

O seu símbolo é o guión curto, «-», e colócase entre dous valores ou variables para restarlle o segundo valor ao primeiro.

Desprazamento[editar]

Desprazamento á esquerda[editar]

O operador «<<» despraza a representación binaria cara a esquerda, tirando cos bits máis significativos e engadindo bits de valor 0 ao final. O resultado equivale a multiplicar o enteiro por unha potencia de dous.

Por exemplo, a nivel binario, 1100 << 1 dá como resultado 11000.

Desprazamento á dereita[editar]

O operador de desprazamento á dereita, «>>», actúa de forma distinta segundo o tipo de dato co que traballe, segundo este sexa natural (só valores positivos) ou enteiro (valores positivos e negativos).

O operador de desprazamento á dereita para valores naturais é o que ás veces se coñece coma desprazamento lóxico á dereita. Despraza a representación binaria á dereita, tirando cos bits menos significativos e engadindo bits de valor 0 ao principio. O resultado é equivalente a dividir por unha potencia de dous no caso dos números naturais.

Por exemplo, a nivel binario, 1100 >> 1 dá como resultado 110.

O operador de desprazamento á dereita para valores enteiros é o que ás veces se coñece coma desprazamento aritmético á dereita. Despraza a representación binaria á dereita, tirando cos bits menos significativos, pero engadindo bits ao principio co mesmo valor do bit de signo orixinal. O resultado é equivalente a dividir por unha potencia de dous no caso dos números naturais.

Operadores de comparación[editar]

Entre dúas expresión, devolven 1 cando se cumpre a expresión e 0 cando non. Son os seguintes:

  • Maior que, «>».
  • Menor que, «<».
  • Maior ou igual que, «>=».
  • Menor ou igual que, «<=».

Operadores de igualdade[editar]

Funcionan do mesmo xeito que os operadores anteriores, coa diferencia de que teñen menos prioridade de execución. Son os seguintes:

  • Igual que, «==»[1].
  • Distinto de, «!=».

Operadores a nivel de bit[editar]

Para comprender o seu significado, cómpre botarlle unha ollada ao capítulo ao respecto do libro de Sistemas informáticos multiusuario e en rede. Son os seguintes:

  • Produto lóxico, «&».
    Por exemplo, a nivel binario, 1100 & 1010 dá como resultado 1000.
  • Suma lóxica, «|».
    Por exemplo, a nivel binario, 1100 | 1010 dá como resultado 1110.
  • Suma lóxica exclusiva, «^».
    Por exemplo, a nivel binario, 1100 ^ 1010 dá como resultado 0110.

Entre eles a prioridade é distinta, seguindo a orde en que están listados (con maior preferencia o que está máis arriba na lista).

Operadores lóxicos[editar]

Son os seguintes:

  • E, «&&», devolverá 1 se o valor das dúas expresións entre as que está é certo ─distinto de cero─, e 0 en caso contrario.
  • Ou, «||», devolverá 1 se o valor de algunha das dúas expresións entre as que está é certo ─distinto de cero─, e 0 en caso contrario.

Cómpre comentar que nos casos en que unha das partes xa converte en certa unha expresión lóxica, o sistema actúa de maneira eficiente e ignora o resto da expresión. Hai que ter ollo, pois nalgúns casos pode resultar problemático.

Operadores condicionais[editar]

O operador de tres operandos ?: é o operador condicional. Nada como un exemplo para comprendelo: (x ? y : z) ten o valor de y se o valor de x é distinto de 0, ou o valor de z en caso contrario.

Operadores de asignación[editar]

Existen uns operadores de asignación que combinan o operador de asignación, «=», con algún operador dos que xa se viron neste capítulo. Todos seguen o mesmo patrón: x op= y equivale a x = x op y, onde op é o operando. Son os seguintes:

  • *=
  • /=
  • %=
  • +=
  • -=
  • <<=
  • >>=
  • &=
  • ^=
  • |=

A coma[editar]

A coma, «,», pode actuar como operador, e é de todos o que ten unha menor prioridade. Cando unha coma separa expresións, avalíanse todas as expresións, e o valor que conta é o valor da última delas. Por exemplo, o valor da expresión x , y sería o de y, se ben se avaliaría tamén x.

Este operador adoita utilizarse de maneira exclusiva na primeira e terceira parte dos parénteses do ciclo for. E non debe confundirse coas comas utilizadas nos argumentos das chamadas ás funcións, pois estas teñen só a función de servir como separadores dos argumentos.

Notas[editar]

  1. Non confundir con =, o símbolo de asignación de valores ás variables.

Véxase tamén[editar]

Outros capítulos[editar]


C
← Volver a Tamaño Operadores Seguir con Instrucións de control