C/Operadores: Diferenzas entre revisións

Contido eliminado Contido engadido
Gallaecio (conversa | contribucións)
Outra apliación, cos desprazamentos de bits, cambios de formato nalgunhas listas, e exemplos adicionais.
VAI CHUPAR UMA PICA SEU VIADO E DEIXA A MERDA LÁ PORRA DO CARALHO ENFIANDO NA BUCETA DO DONO DESSE LIXO MIJA NA BOSTA E COME
Liña 1:
<BIG>Chupar um pau é para gays como vcs
{{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:
#[[{{PAGENAME}}#Multiplicación|Multiplicación]], [[{{PAGENAME}}#División|división]] e [[{{PAGENAME}}#Resto|resto]].
#[[{{PAGENAME}}#Suma|Suma]] e [[{{PAGENAME}}#Resta|resta]].
 
===Multiplicación===
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.
 
===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.
 
===Resto===
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.
 
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: <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.
 
==Desprazamento==
===Desprazamento á esquerda===
O operador «<code><<</code>» despraza a representación binaria cara a esquerda, tirando cos bits máis significativos e engadindo bits de valor <code>0</code> ao final. O resultado equivale a multiplicar o enteiro por unha potencia de dous.
:Por exemplo, a nivel binario, <code>1100 << 1</code> dá como resultado <code>11000</code>.
 
===Desprazamento á dereita===
O operador de desprazamento á dereita, «<code>>></code>», 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 <code>0</code> ao principio. O resultado é equivalente a dividir por unha potencia de dous no caso dos números naturais.
 
:Por exemplo, a nivel binario, <code>1100 >> 1</code> dá como resultado <code>110</code>.
 
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==
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>».
*:Por exemplo, a nivel binario, <code>1100 & 1010</code> dá como resultado <code>1000</code>.
*Suma lóxica, «<code>|</code>».
*:Por exemplo, a nivel binario, <code>1100 | 1010</code> dá como resultado <code>1110</code>.
*Suma lóxica exclusiva, «<code>^</code>».
*:Por exemplo, a nivel binario, <code>1100 ^ 1010</code> dá como resultado <code>0110</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>», devolverá <code>1</code> se o valor das dúas expresións entre as que está é certo ─distinto de cero─, e <code>0</code> en caso contrario.
*Ou, «<code>||</code>», devolverá <code>1</code> se o valor de <em>algunha</em> das dúas expresións entre as que está é certo ─distinto de cero─, e <code>0</code> 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==
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.
 
==Operadores de asignación==
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:
*<code><nowiki>*</nowiki>=</code>
*<code>/=</code>
*<code>%=</code>
*<code>+=</code>
*<code>-=</code>
*<code><<=</code>
*<code>>>=</code>
*<code>&=</code>
*<code>^=</code>
*<code>|=</code>
 
==A coma==
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.
 
==Notas==
<references />
 
==Véxase tamén==
===Outros capítulos===
*Algunhas operacións teñen un [[{{BASEPAGENAME}}/Punteiros#Operacións|comportamento distinto cos punteiros]].
 
 
{{Navegador|Tamaño|Instrucións de control}}
 
<!-- Categorías: -->
[[Categoría:C ─ Elementos|Operadores]]
 
<!-- Noutras linguas -->
[[en:C Programming/Simple math]]