C/Operadores: Diferenzas entre revisións

Contido eliminado Contido engadido
Gallaecio (conversa | contribucións)
Primeira revisión
Gallaecio (conversa | contribucións)
Completado co contido da versión en inglés.
Liña 1:
{{Navegador|Tamaño|Instrucións de control}}
 
{| align="right" style="margin-left: 1em;"
| __TOC__
|} <!-- Isto sitúa o índice á dereita -->
 
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==
===Identificador===
Sempre que se declarase previamente designando unha [[{{BASEPAGENAME}}/Variables|variable]] ou unha [[{{BASEPAGENAME}}/Funcións|función]], un [[{{BASEPAGENAME}}/Identificadores|identificador]] será unha expresión de primeiro nivel.
 
===Constante literal===
As [[{{BASEPAGENAME}}/Constantes literais|constantes literais]] son expresións de primeiro nivel.
 
===Cadea de caracteres===
As [[{{BASEPAGENAME}}/Cadeas de caracteres|cadeas de caracteres]] son expresións de primeiro nivel.
 
===Parénteses===
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: «<code>(</code>» é o paréntese inicial e «<code>)</code>» o final.
 
==Expresións de segundo nivel==
Son expresións de segundo nivel o conxunto das [[{{PAGENAME}}#Expresións de primeiro nivel|expresións de primeiro nivel]] e as seguintes:
 
===Delimitador dunha matriz===
Un delimitador dunha matriz é unha expresión formada por: unha expresión de segundo nivel seguida doutra expresión entre corchetes («<code><nowiki>[</nowiki></code>» e «<code><nowiki>]</nowiki></code>»). A primeira expresión será dun tipo “apuntador” ─unha [[{{BASEPAGENAME}}/Matrices|matriz]] ou un [[{{BASEPAGENAME}}/Punteiros|punteiro]]─, e a segunda de tipo [[{{BASEPAGENAME}}/Tipos fundamentais|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: <code>identificador[3][7]</code>) estaremos falando de matrices de varias dimensións.
 
===Chamada a unha función===
Unha chamada a unha [[{{BASEPAGENAME}}/Funcións|función]] é unha expresión de segundo nivel seguida de [[{{PAGENAME}}#Parénteses|parénteses]] que poden conter ou non unha lista de argumentos.
 
===Elemento dunha agrupación===
Un elemento dunha agrupación ─unha [[{{BASEPAGENAME}}/Estruturas|estrutura]] ou unha [[{{BASEPAGENAME}}/Unións|unión]]─ sinálase mediante unha expresión de segundo nivel ─que se corresponde cunha agrupación─ seguida dun punto, «<code>.</code>», e este seguido dun [[{{BASEPAGENAME}}/Identificadores|identificador]] ─o identificador do elemento da agrupación─. Se a expresión de segundo nivel é un [[{{BASEPAGENAME}}/Punteiros|punteiro]] a unha agrupación en vez dunha agrupación directamente, o punto substituirase por unha “frecha”: «<code>-></code>».
 
===Incremento e redución===
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, «<code>++</code>», ou un de redución, «<code>--</code>». Se o operador está <em>antes</em> da expresión en vez de despois, xa se trataría o conxunto dunha [[{{PAGENAME}}#Expresións de terceiro nivel|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á <em>antes</em> 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á <em>despois</em> da expresión de segundo nivel, o valor desta ─sen cambios─ será o valor da expresión resultante (por exemplo, o valor de <code>a</code> é o mesmo que o de <code>a++</code>), e o cambio aplicarase <em>despois</em> de utilizar a expresión.
 
A mellor forma de entendelo é mediante un exemplo práctico:
<source lang=c>
// 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;
</source>
 
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 [[{{BASEPAGENAME}}/Comentarios|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 <code>while</code>====
Cómpre asemade saber que expresar da seguinte forma un ciclo [[{{BASEPAGENAME}}/Instrucións de control#while|<code>while</code>]]:
:<source lang=c>while(variable[indice++]);</source>
equivale a estoura expresión dun ciclo [[{{BASEPAGENAME}}/Instrucións de control#for|<code>for</code>]]:
:<source lang=c>for(i=0;variable[indice];indice++);</source>
 
==Expresións de terceiro nivel==
Son expresións de terceiro nivel o conxunto das [[{{PAGENAME}}#Expresións de segundo nivel|expresións de segundo nivel]] e as seguintes:
 
===Incremento e redución===
Son de terceiro nivel cando o operador vai despois, como xa se explicou antes. [[{{PAGENAME}}#Incremento e redución|Remítase alí]] para entender en que consisten ou o seu funcionamento.
 
===Enderezo===
O operador de enderezo, se se sitúa diante dunha variable calquera ─[[{{PAGENAME}}#Expresións de cuarto nivel|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 é: «<code>&</code>».
 
===Apuntado===
O operador de apuntado, precedendo a un [[{{BASEPAGENAME}}/Punteiros|punteiro]] ─[[{{PAGENAME}}#Expresións de cuarto nivel|expresió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: «<code>*</code>».
 
===Complemento a dous===
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, «<code>-</code>», e colócase precedendo un valor ou unha variable ─[[{{PAGENAME}}#Expresións de cuarto nivel|expresión de cuarto nivel]]─.
 
===Signo positivo===
O signo positivo é un operador que non cambia nada.
 
O seu símbolo é «<code>+</code>», e colócase precedendo un valor ou unha variable ─[[{{PAGENAME}}#Expresións de cuarto nivel|expresión de cuarto nivel]]─.
 
===Negación lóxica===
O seu símbolo é un peche de exclamación, «<code>!</code>», e colócase precedendo un valor ou unha variable ─[[{{PAGENAME}}#Expresións de cuarto nivel|expresión de cuarto nivel]]─. Equivale a unha equiparación lóxica do valor ao que precede a cero.
 
Por exemplo, <code>(!variable)</code> é o mesmo que <code>(0==variable)</code>.
 
===Complemento a un===
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 <code>10011100</code> sería <code>01100011</code>.
 
O seu símbolo é un til como o do ñ, «<code>~</code>», e colócase precedendo un valor ou unha variable ─[[{{PAGENAME}}#Expresións de cuarto nivel|expresión de cuarto nivel]]─.
 
===<code>sizeof</code>===
Aínda que parece unha función, <code>sizeof()</code> é 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:
<source lang=c>
sizeof variable;
sizeof(tipo);
</source>
 
O operador devolve o valor da cantidade de bytes co tipo <code>size_t</code> ─definido no ficheiro de cabeceira [[{{BASEPAGENAME}}/stddef.h|<code>stddef.h</code>]]─, que so admite valores positivos (números naturais).
 
==Expresións de cuarto nivel==
Son expresións de cuarto nivel o conxunto das [[{{PAGENAME}}#Expresións de terceiro nivel|expresións de terceiro nivel]] e as seguintes:
 
===Moldes===
Os [[{{BASEPAGENAME}}/Moldes|moldes]] seguidos de expresións de cuarto nivel son en conxunto expresións de cuarto nivel.
 
==Operadores aritméticos==
Á hora de realizar operacións {{W|Aritmética|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 [[{{BASEPAGENAME}}/Tipos fundamentais|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:
Os seguintes operadores están organizados en grupos de prioridade á hora de executarse:
#[[{{PAGENAME}}#Multiplicación|Multiplicación]], [[{{PAGENAME}}#División|división]] e [[{{PAGENAME}}#Resto|resto]].
<table border="1" cellspacing="0" cellpadding="5">
#[[{{PAGENAME}}#Suma|Suma]] e [[{{PAGENAME}}#Resta|resta]].
<tr>
<td>
;( ):Os parénteses establecen prioridade de execución para o seu contido respecto do que hai fóra.
</td>
</tr>
<tr>
<td>
;<code>&</code>:Precedendo a unha variable calquera, indica que se traballa co enderezo de memoria en que esta se garda en lugar de traballar co seu valor.
 
===Multiplicación===
;&#42;:Precedendo a un [[{{BASEPAGENAME}}/Punteiros|punteiro]], 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.
Para saber en que consiste a multiplicación, búsquese un libro de matemáticas fundamentais.
 
O seu símbolo é o asterisco, «<code>*</code>», e colócase entre dous valores ou variables para calcular o seu produto.
;<code>sizeof()</code>:Aínda que semella unha función, <code>sizeof()</code> é un operador de C. Devolve a cantidade de bytes que ocupa en memoria unha variable ou un tipo de dato fornecido coma argumento. Exemplo:
:<source lang=c>sizeof(int);</source>
:<source lang=c>sizeof(variable);</source>
</td>
</tr>
<tr>
<td>
;<code>*</code>:Multiplicación.
 
;<code>/</code>:===División.===
Para saber en que consiste a división, búsquese un libro de matemáticas fundamentais.
 
O seu símbolo é a barra inclinada, «<code>/</code>», que se sitúa entre dous valores ou variables a dividir, sendo o primeiro valor o dividendo e o segundo o divisor.
;<code>%</code>:Resto dunha división de números [[{{BASEPAGENAME}}/Tipos fundamentais|enteiros]].
:Non fai falla que tanto dividendo coma divisor sexan números enteiros. Abonda con que un dos dous o sexa.
:Este operador resulta moi útil ao traballar con [[{{BASEPAGENAME}}/Instrucións de control|instrucións de control]]. Permite por exemplo comprobar nunha división se o dividendo é un múltiplo do divisor.
</td>
</tr>
<tr>
<td>
;<code>+</code>:Suma.
 
===Resto===
;<code>-</code>:Resta.
O resto é a cantidade que sobra ao realizar unha división entre dous números [[{{BASEPAGENAME}}/Tipos fundamentais|enteiros]].
 
O seu símbolo é o de porcentaxe, «<code>%</code>», e sitúase entre dous valores para saber cal sería o resto froito da súa división.
;<code>-</code>:Complemento a dous (cambio de signo).
 
</td>
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.
</tr>
 
</table>
Ao traballar co resto hai que ter coidado, xa que non actúa exactamente como se podería esperar en Matemáticas. Por exemplo: <code>(-5) % 2 = -1</code> (non <code>1</code> 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: <code>(-5) % 3 = -1</code> (non <code>-2</code>, como podería esperarse).
 
Este operador resulta moi útil ao traballar con [[{{BASEPAGENAME}}/Instrucións de control|instrucións de control]]. Permite, por exemplo, comprobar nunha división se o dividendo é un múltiplo do divisor.
 
===Suma===
Para saber en que consiste a suma, búsquese un libro de matemáticas fundamentais.
 
O seu símbolo é «<code>+</code>», e colócase entre dous valores ou variables para sumar ambos os dous valores.
 
===Resta===
Para saber en que consiste a resta, búsquese un libro de matemáticas fundamentais.
 
O seu símbolo é o guión curto, «<code>-</code>», e colócase entre dous valores ou variables para restarlle o segundo valor ao primeiro.
 
==Operadores de comparación==
Entre dúas expresión, devolven <code>1</code> cando se cumpre a expresión e <code>0</code> cando non. Son os seguintes:
*maior que: <code>></code>
*menor que: <code><</code>
*maior ou igual que: <code>>=</code>
*menor ou igual que: <code><=</code>
 
==Operadores de igualdade==
Funcionan do mesmo xeito que os [[{{PAGENAME}}#Operadores de comparación|operadores anteriores]], coa diferencia de que teñen menos prioridade de execución. Son os seguintes:
*igual que: <code>==</code><ref>Non confundir con <code>=</code>, o símbolo de asignación de valores ás variables.</ref>
*distinto de: <code>!=</code>
 
==Operadores a nivel de bit==
Para comprender o seu significado, cómpre botarlle unha ollada ao [[Sistemas informáticos multiusuario e en rede/Operacións lóxicas|capítulo ao respecto]] do libro de [[Sistemas informáticos multiusuario e en rede]]. Son os seguintes:
*produto lóxico: <code>&</code>
*suma lóxica: <code>|</code>
*suma lóxica exclusiva: <code>^</code>
 
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==
Son os seguintes:
*e: <code>&&</code>
*ou: <code>||</code>
*non: <code>!</code>
 
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.
==Sentencias operativas==
Estes dous operadores, xunto coa variable coa que se utilicen, forman de por si unha sentencia de C. Isto significa que non tería sentido mesturalos con outros operadores nunha expresión, porque forman xa de por si unha expresión.
 
==Operadores condicionais==
;++:Incremento. Incrementa nunha unidade a variable que o segue ou o precede.
O operador de tres operandos <code>?:</code> é o operador condicional. Nada como un exemplo para comprendelo: <code>(x ? y : z)</code> ten o valor de <code>y</code> se o valor de <code>x</code> é distinto de <code>0</code>, ou o valor de <code>z</code> en caso contrario.
:Por exemplo, as seguintes liñas de código son equivalentes, é dicir, o seu resultado é o mesmo:
:<source lang=c>a = a + 1;</source>
:<source lang=c>a++</source>
:<source lang=c>++a</source>
:A diferencia entre situar a variable antes ou despois do operador radica na combinación da expresión coa asignación do resultado a unha variable, ou a súa utilización nunha función coma [[{{BASEPAGENAME}}/printf|<code>printf()</code>]].
:<source lang=c>b = a++ // Incremento posterior, equivale a: b = a; a = a + 1;</source>
:<source lang=c>b = ++a // Incremento previo, equivale a: a = a + 1; b = a;</source>
 
==Operadores de asignación==
;--:Redución. Reduce nunha unidade a variable que o segue ou o precede.
Existen uns operadores de asignación que combinan o operador de asignación, «<code>=</code>», con algún operador dos que xa se viron neste capítulo. Todos seguen o mesmo patrón: <code>x op= y</code> equivale a <code>x = x op y</code>, onde <code>op</code> é o operando. Son os seguintes:
:Por exemplo, as seguintes liñas de código son equivalentes, é dicir, o seu resultado é o mesmo:
*<code><nowiki>*</nowiki>=</code>
:<source lang=c>a = a - 1;</source>
*<code>/=</code>
:<source lang=c>a--</source>
*<code>%=</code>
:<source lang=c>--a</source>
*<code>+=</code>
:A diferencia entre situar a variable antes ou despois do operador radica na combinación da expresión coa asignación do resultado a unha variable, ou a súa utilización nunha función coma [[{{BASEPAGENAME}}/printf|<code>printf()</code>]].
*<code>-=</code>
:<source lang=c>b = a-- // Redución posterior, equivale a: b = a; a = a - 1;</source>
*<code>&=</code>
:<source lang=c>b = --a // Redución previa, equivale a: a = a - 1; b = a;</source>
*<code>^=</code>
*<code>|=</code>
 
==A coma==
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 poden perfectamente usarse as súas equivalencias, mencionadas nos respectivos comentarios.
A coma, «<code>,</code>», 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 <code>x , y</code> sería o de <code>y</code>, se ben se avaliaría tamén <code>x</code>.
 
Este operador adoita utilizarse de maneira exclusiva na primeira e terceira parte dos parénteses do ciclo [[{{BASEPAGENAME}}/Instrucións de control|<code>for</code>]]. 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.
Algunhas persoas poden considerar estas expresións complicadas de entender (normal ao principio), e usar as equivalencias. 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.
 
===Uso na sentencia <code>while</code>===
Cómpre asemade saber que:
:<source lang=c>while(variable[indice++]);</source>
equivale ao seguinte:
:<source lang=c>for(i=0;variable[indice];indice++);</source>
 
==Notas==
Liña 92 ⟶ 207:
 
==Véxase tamén==
===Outros capítulos===
*Algunhas operacións teñen un [[{{BASEPAGENAME}}/Punteiros#Operacións|comportamento distinto cos punteiros]].
 
Liña 100 ⟶ 214:
<!-- Categorías: -->
[[Categoría:C ─ Elementos|Operadores]]
 
<!-- Noutras linguas -->
[[en:C Programming/Simple math]]