C/Modificadores: Diferenzas entre revisións

Contido eliminado Contido engadido
Gallaecio (conversa | contribucións)
Revisión inicial, continuará...
Gallaecio (conversa | contribucións)
Completo
Liña 7:
Os modificadores son como adxectivos que se utilizan nas declaracións de variables para modificar as súas propiedades.
 
==Signo e lonxitudetamaño==
Aos tipos [[{{BASEPAGENAME}}/Tipos fundamentais#Enteiros|enteiros]] pódeselles engadir un modificador de signo, que permite establecer se a variable pode ou non conter valores negativos. Deste xeito, os rangos de valores dos tipos <source lang=c enclose=none>int</source> e <source lang=c enclose=none>char</source> poden modificarse.
 
Os modificadores de signo son <source lang=c enclose=none>signed</source>, que indica que a variable pode conter números tanto negativos como positivos, e <source lang=c enclose=none>unsigned</source>, que indica que a variable só pode conter valores positivos, duplicando ─en realidade, ampliando na metade máis un─ a cantidade de valores positivos que pode conter.
 
Para indicar se un tipo de dato vai ser <source lang=c enclose=none>signed</source> ─valor por defecto, non é preciso indicalo─ ou <source lang=c enclose=none>unsigned</source>, precédese o tipo da variable desa palabra na súa declaración, coma no exemplo:
Liña 18:
</source>
 
Existen tamén uns modificadores que permiten cambiar o tamaño das variables <source lang=c enclose=none>int</source> e <source lang=c enclose=none>double</source>: <source lang=c enclose=none>short</source>, para diminuír o tamaño ─só pode utilizarse co tipo <source lang=c enclose=none>int</source>─, <source lang=c enclose=none>long</source>, para amplialo, e <source lang=c enclose=none>long long</source>, para amplialo máis.
Facendo uso dos modificadores de signo e lonxitude pódense obter as seguintes combinacións:
 
O tamaño dun <source lang=c enclose=none>int</source> non é necesariamente maior ca un <source lang=c enclose=none>short int</source> e menor que un <source lang=c enclose=none>long int</source>, senón que o que se cumpre é que:
:<source lang=c enclose=none>short int</source> <= <source lang=c enclose=none>int</source> <= <source lang=c enclose=none>long int</source>
 
Facendo uso dos modificadores de signo e lonxitude pódense obter as combinacións da táboa que se amosa a continuación. Téñase en conta que os valores de tamaño e, en consecuencia, rango, poderían cambiar dependendo da arquitectura do sistema operativo e do compilador utilizados.
 
<table border=1 cellspacing=0 cellpadding=5>
<tr style="text-align: center;">
Liña 28 ⟶ 34:
</tr>
<tr>
<td style="text-align: center;"><source lang=c enclose=none>signed</source></td>
<td style="text-align: center;"><source lang=c enclose=none>char</source></td>
<td style="text-align: right;">1 byte</td>
<td style="text-align: center;">-128 ─ 127</td>
<td style="text-align: center;"><source lang=c enclose=none>
char
</source></td>
</tr>
<tr>
<td style="text-align: center;"><source lang=c enclose=none>unsigned</source></td>
<td style="text-align: center;"><source lang=c enclose=none>char</source></td>
<td style="text-align: right;">1 byte</td>
<td style="text-align: center;">0 ─ 255</td>
<td style="text-align: center;"><source lang=c enclose=none>
</source></td>
</tr>
<tr>
<td style="text-align: center;"><source lang=c enclose=none>signed short</source></td>
<td style="text-align: center;"><source lang=c enclose=none>int</source></td>
<td style="text-align: right;">2 bytes</td>
<td style="text-align: center;">-32768 ─ 32767</td>
<td style="text-align: center;">
<source lang=c enclose=none>short int</source><br />
<source lang=c enclose=none>signed short</source><br />
<source lang=c enclose=none>short</source>
</td>
</tr>
<tr>
<td style="text-align: center;"><source lang=c enclose=none>unsigned short</source></td>
<td style="text-align: center;"><source lang=c enclose=none>int</source></td>
<td style="text-align: right;">2 bytes</td>
<td style="text-align: center;">0 ─ 65535</td>
<td style="text-align: center;">
<source lang=c enclose=none>unsigned short</source><br />
</td>
</tr>
<tr>
<td style="text-align: center;"><source lang=c enclose=none>signed</source></td>
<td style="text-align: center;"><source lang=c enclose=none>int</source></td>
<td style="text-align: right;">4 bytes</td>
<td style="text-align: center;">-2.147.483.648 ─ 2.147.483.647</td>
<td style="text-align: center;">
<source lang=c enclose=none>int</source><br />
<source lang=c enclose=none>signed</source><br />
</td>
</tr>
<tr>
<td style="text-align: center;"><source lang=c enclose=none>unsigned</source></td>
<td style="text-align: center;"><source lang=c enclose=none>int</source></td>
<td style="text-align: right;">4 bytes</td>
<td style="text-align: center;">0 ─ 4.294.967.296</td>
<td style="text-align: center;">
<source lang=c enclose=none>unsigned</source><br />
</td>
</tr>
<tr>
<td style="text-align: center;"><source lang=c enclose=none>signed long</source></td>
<td style="text-align: center;"><source lang=c enclose=none>int</source></td>
<td style="text-align: right;">8 bytes</td>
<td style="text-align: center;">-9.223.372.036.854.775.807 ─ 9.223.372.036.854.775.807</td>
<td style="text-align: center;">
<source lang=c enclose=none>long int</source><br />
<source lang=c enclose=none>signed long</source><br />
<source lang=c enclose=none>long</source><br />
</td>
</tr>
<tr>
<td style="text-align: center;"><source lang=c enclose=none>unsigned long</source></td>
<td style="text-align: center;"><source lang=c enclose=none>int</source></td>
<td style="text-align: right;">8 bytes</td>
<td style="text-align: center;">0 ─ 18.446.744.073.709.551.615</td>
<td style="text-align: center;"><source lang=c enclose=none>
unsigned long
</source></td>
</tr>
<tr>
<td style="text-align: center;"><source lang=c enclose=none>signed long long</source></td>
<td style="text-align: center;"><source lang=c enclose=none>int</source></td>
<td style="text-align: right;"></td>
<td style="text-align: center;"></td>
<td style="text-align: center;">
<source lang=c enclose=none>long long int</source><br />
<source lang=c enclose=none>signed long long</source><br />
<source lang=c enclose=none>long long</source><br />
</td>
</tr>
<tr>
<td style="text-align: center;"><source lang=c enclose=none>unsigned long long</source></td>
<td style="text-align: center;"><source lang=c enclose=none>int</source></td>
<td style="text-align: right;"></td>
<td style="text-align: center;"></td>
<td style="text-align: center;"><source lang=c enclose=none>
unsigned long long
</source></td>
</tr>
<tr>
<td style="text-align: center;"><source lang=c enclose=none>long</source></td>
<td style="text-align: center;"><source lang=c enclose=none>double</source></td>
<td style="text-align: right;">10 bytes</td>
<td style="text-align: center;"></td>
<td style="text-align: center;"><source lang=c enclose=none>
</source></td>
</tr>
<tr>
<td style="text-align: center;"><source lang=c enclose=none>long long</source></td>
<td style="text-align: center;"><source lang=c enclose=none>double</source></td>
<td style="text-align: right;"></td>
<td style="text-align: center;"></td>
Liña 38 ⟶ 148:
 
==<source lang=c enclose=none>const</source>==
Este modificador indica que o valor co que se ''inicializa'' unha variable non se pode modificar ao longo do programa, o que implica que é obrigatorio asignarlle un valor á variable na súa declaración. Aínda que istoo modificador pode non parecer moi útil, en certas situacións o seu uso cobra sentido, e permite a optimización do programa durante o proceso de compilación ─ao saber o compilador que o valor da variable non cambia─. En xeral trátase dun método máis elegante de definir valores constantes do que o é utilizar as [[{{BASEPAGENAME}}/Directrices para o preprocesador#.23define|directrices para o ''preprocesador'']].
 
Un exemplo podería ser a declaración de π (Pi) para poder usar o seu valor ao longo do programa:
Liña 48 ⟶ 158:
 
==<source lang=c enclose=none>static</source>==
Ao declarar unha función ou variable '''global''' como estática (<source lang=c enclose=none>static</source>) vólvese “interna”, ou o que é o mesmo, inaccesible dende o código fonte doutros ficheiros mediante o modificador [[#extern|<source lang=c enclose=none>extern</source>]].
 
Ao declarar unha variable '''local''' como estática, créase coma calquera outra variable. Así e todo, ao saíren do [[{{BASEPAGENAME}}/Variables#Ámbito|ámbito da variable]] (por exemplo, ao rematar o bloque para o cal é local) a variable permanece na memoria ata finalizar a execución do programa, conservando o seu valor. Aínda que este comportamento aseméllase ao das variables globais, diferéncianse destas en que as variables estáticas locais seguen a obedecer ás regras do ámbito e por tanto non pode accederse a elas dende fóra deste.
 
As variables declaradas coma <source lang=c enclose=none>static</source> ''inicialízanse'' co valor nulo (<code>0</code>) por defecto.
 
==<source lang=c enclose=none>auto</source>==
Este modificador ─que en certos aspectos podería considerarse o ''alter ego'' do <source lang=c enclose=none>static</source> local─ indica que a variable en cuestión debe ser “destruída” ao saír o programa do seu [[{{BASEPAGENAME}}/Variables#Ámbito|ámbito]]. Dado que este é o comportamento por defecto das variables, o seu uso é completamente innecesario.
 
==<source lang=c enclose=none>extern</source>==
Este modificador utilízase cando un ficheiro necesita acceder a unha variable noutro ficheiro que podería non estar incluído ([[{{BASEPAGENAME}}/Directrices para o preprocesador#.23include|<source lang=c enclose=none>#include</source>]]) no código fonte do programa. O modificador non crea espazo para unha nova variable, senón que fornece ao compilador información abondo para acceder á variable do ficheiro remoto.
 
==<source lang=c enclose=none>volatile</source>==