FizWeb

Porkoláb Zoltán - C programozás 2017.10.02. előadás jegyzet

3. előadás: Preprocesszor és használata.

#include 

int main()   /* hello program */ //comment
{
  printf("Hello!\n", );
  return 0;
}

//---------------//
Preprocesszor direktívák:
#include 

--> "file"
--> "./dir/file" //relative PATH
--> "/home/dir/file" //absolute PATH

gcc -I /home/gsd/include

/////////////

macro: //csupa nagybetű
#define BUFSIZE 1024
//mindenhol lecseréli, kivéve stringben

#define MAX(x,y) x>y ? x:y  //ha x>y, akkor x, különben y

baj lehet:

2*MAX(a,5)
--> 2*a>5 ? a:5 //a 2a-t hasonlítaná össze az 5-tel

erre megoldás:
((x)>(y)?(x):(y))

baj (??):
2*MAX(++a,5)
--> 2*((++a)>(5)?(++a):(5))

MINIMALIZÁLJUK a macrók használatát!
(DE néha hasznos)
/////////////
include őrszemek (header guards):   #if, #ifdef, #ifndef
--> csak egyszer kell egy fájl
#ifndef FILE_H
#define FILE_H  //header file
//...
#endif /* FILE_H */

--> feltételes fordítás
  először FILE_H -> false, nem definiált, lefordítja
  ezután ifndef hamis lesz

/////////////
PATH:
- linux: ../../...
- win: ..\..\...

--> van h vmit csak linuxon akarok futtatni:
#ifdef __LINUX__ && GCC > 4.2
  /* linux specifikus kód */
#else
#error "Not implemented."
#endif

///////
__FILE__
__LINE__
--> macrók, melyik fájlban hányadik sornál vagyunk (hibaüzenetek!!)
///////

nagy programrészlet:
#ifdef VER_17

#ifdef VER_18

////////////////////

tokenek:

- azonosítók (amiket mi találunk ki): main, printf, Int, iNt, iF akár :D
stílus: ez_egy_valtozo/ ezEgyValtozo -> camel case (Hungarian notation: Charles Simonyi)
- kulcsszavak: int, double, char, f, while, for, return
- literálok: 0xc, 12, 3.14l, 0.5f, "a", "\'", "\t", "\0", "Hello\n", "\377", "\xff" (egyes karakterek)
(régen 014 oktális konstans, 0XC hexa)
- operátorok: ()...
- szeparátorok: {}, ;

Fordítás: #, komment -> már akkor

UNIX chmod:
rw- r-- r--
110 100 100 - bin
 6   4   4  - oct

Miért örül a programozó Halloweenkor karácsonynak? oct.30. - dec.25.
:P

.5f 3.14l -> valós számok ábrázolása
m*2^k - mantissza, karakterisztika
float/double: a mantisszában van különbség (más pontosság)

short < int < long < long long
float < double < long

C-ben az int nem határozza meg, hogy hány bit legyen (<-> Java), hardware-től függ

char: "a", "\"" -> escape char: össz. egy byte
string: "Hello\n" -> végén lezáró "\0"

////////////////

#include 

#define LOWER -100
#define UPPER 400
#define STEP 10
#define F2C(x) ((5./9.)*((x)-32))

int main()
{
  int fahr;
  for (fahr=LOWER; fahr

double fahr2cels(double);
int main(){
  const int lower = -100;
  const int upper = 400;
  const int step = 10;
  for (int fahr=lower; fahr <= upper; fahr += step){
    printf("fahr=%d,\tcels=%f\n", fahr, fahr2cels(fahr));  //a fv. működik, mert az intet double-lé konvertálja
  }
  return 0;
}

double fahr2cels(double f){
  return 5./9.*(f-32);
}
//lehetőleg deklaráljuk a függvény a paraméter típusával együtt!!
f(void) //ez is jó, nincs meghatározva a típus