GNU/Linux >> Znalost Linux >  >> Linux

C Výukový program programování 4 - Proměnné a paměť

V této sérii tutoriálů jsme zatím diskutovali o tom, jak vytvořit a spustit základní program v C, co jsou preprocesory a také základy proměnných. Nyní se pojďme ponořit trochu hluboko do proměnných a diskutovat o aspektu paměti.

Za předpokladu, že jste si již prošli všechny naše výukové programy (nebo máte základní znalosti potřebné k pochopení tohoto výukového programu), začněme jednoduchým příkladem kódu, který jsme použili v jednom z našich předchozích výukových programů.

#include <stdio.h>

int main (void)
{
int num = 0, temp=0;
printf("\n Enter a positive integer: ");
scanf("%d", &num);
temp = num;
int result = 1;
while (temp > 0)
{
result = result * temp;
temp = temp -1;
}

printf("\n Factorial of %d is %d\n", num, result);

return 0;
}

Tento program, jak vidíte, počítá faktoriál čísla zadaného uživatelem.

Nyní, pro menší celá čísla, jako je 5 nebo 6, bude tento program fungovat dobře - správně vypíše faktoriál. Ale řekněme, že to zkusíte pro číslo 13. Zde je výsledek, který dostanete:

Factorial of 13 is 1932053504

Ale to není pravda, protože faktoriál 13 je 6227020800. Je tedy přirozeně otázkou, proč náš program odpověděl špatně? Odpověď spočívá v množství paměti, kterou proměnná int zabírá v systému.

Ve většině dnešních systémů zabírá int 4 bajty (nebo 32 bitů) paměti. Všimněte si, že pomocí následujícího řádku ve svém programu můžete zjistit, kolik bytů int zabírá ve vašem systému.

printf("\n int size in bytes is: %d ", sizeof (int));

A protože proměnná int může ukládat i záporné hodnoty, rozsah hodnot, které může ukládat, se pohybuje od –2 147 483 648 do 2 147 483 647.

Nyní, protože faktoriál 13 je mnohem větší než maximální hodnota, kterou může proměnná int pojmout, náš program dává špatný výstup. Jediným způsobem, jak program opravit, je použít typ proměnné, která má kapacitu 6227020800. 

Chcete-li zachovat větší kladné celé číslo, můžete použít „unsigned int“, do kterého lze uložit hodnoty od 0 do 4 294 967 295 (za předpokladu, že tento typ proměnných zabírá ve vašem systému 4 bajty). Ale zde ani 'unsigned int' nebude fungovat, protože faktoriál 13 je mimo svou maximální kapacitu.

Náš zachránce by tedy byl „dlouhý dlouhý“, který zabírá 8 bajtů nebo 64 bitů paměti. Takže tady je upravený program:

#include <stdio.h>

int main (void)
{
long long num = 0; long long temp=0;
printf("\n Enter a positive integer: ");
scanf("%d", &num);
temp = num;
long long result = 1;
while (temp > 0)
{
result = result * temp;
temp = temp -1;
}

printf("\n Factorial of %lld is %lld\n", num, result);

return 0;
}

Proměnnou „long long“ určíte pomocí printf nebo scanf pomocí %lld (nebo %I64d v některých případech). Zde je výstup, který tento upravený program vytváří:

Factorial of 13 is 6227020800 

Což je správně.

Nyní tedy známe omezení 'int' a jak lze 'unsigned int' a 'long long' použít k jejich překonání. Mějte na paměti, že „dlouhý; ' je také proměnný typ, ale na většině dnešních systémů zabírá int i long 4 bajty.

Jo, a ano, zatímco 'int', 'unsigned int' a 'long long' jsou pro celá čísla, je tu 'float' a 'double' pro čísla s pohyblivou řádovou čárkou. Float je 32bitový a má 7 desetinných míst s přesností, zatímco double je 64bitový a má přesnost 15 desetinných míst.

Zmínka o číslech s pohyblivou řádovou čárkou mě přivádí k dalšímu důležitému bodu. Souvisí to s dělením. Vezměme si jednoduchý příklad kódu C, abychom to pochopili.

int main (void)
{
int a=5, b=10;

printf("\n a/b is %d", a/b);

return 0;
}

Tento program tedy nedělá nic, ale dělí a b nebo 5 10.

V reálném životě, pokud se kohokoli zeptáte na výsledek 5/10, dostanete ve většině případů jako odpověď 0,5. Ale zde bude odpověď nula (0). Důvodem je, že 'a' i 'b' jsou celá čísla, a proto bude výsledek jejich dělení také považován za celé číslo, takže plovoucí část nebude brána v úvahu.

Chcete-li zachovat plovoucí část, musíte se ujistit, že 'a' i 'b' jsou proměnné s plovoucí desetinnou čárkou.

#include <stdio.h>

int main (void)
{
float a=5, b=10;

printf("\n a/b is %f", a/b);

return 0;
}

V tomto případě by výstup byl 0,5.

V tomto tutoriálu jsme diskutovali o proměnné velikosti a o tom, jak ovlivňuje ukládání hodnot. Doufám, že máte dobrou představu o tom, jak a kdy použít int, unsigned int, long long, float a double. V příštím tutoriálu budeme diskutovat o proměnných typu znaku a také o polích.


Linux
  1. Linux nice and renice Command Tutorial (7 příkladů)

  2. Jak používat atomové proměnné v C?

  3. tmpfs použití a změna velikosti

  1. C Výukový program programování Část 3 - Základy proměnných

  2. C Výukový program programování Část 5 - Znakové proměnné

  3. Výukový program programování v Linuxu C Část 10 - Variabilní rozsahy

  1. Výukový program programování v Linuxu C Část 9:Řetězce

  2. Výukový program programování v Linuxu C Část 12 – Operátory přiřazení a podmíněné výrazy

  3. Linux C výuka programování, část 11 - Aritmetické, relační a logické operátory