C/Operadores: Diferenzas entre revisións

Contido eliminado Contido engadido
m Desfíxose a edición 11305 de Cagar é soltar merda (conversa)
m Bot: Cambios estética
 
Liña 7:
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.
Liña 43:
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:
Liña 60:
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>
Liña 66:
:<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.
 
Liña 113:
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]].
 
Liña 147:
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).
 
Liña 171:
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]].
 
 
Liña 233:
 
<!-- Categorías: -->
<!-- Noutras linguas -->
 
[[Categoría:C ─ Elementos|Operadores]]
 
<!-- Noutras linguas -->
[[en:C Programming/Simple math]]