Difference between revisions of "Prin C ples"
Jump to navigation
Jump to search
m |
m |
||
(6 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
* il C e' conciso (o anche con_C_so): le parole chiave e i simboli degli operatori sono brevi e si evita ogni ridondanza; | * il C e' conciso (o anche con_C_so): le parole chiave e i simboli degli operatori sono brevi e si evita ogni ridondanza; | ||
* il linguaggio C delega tutto il possibile alla libreria standard C (per esempio le operazioni di input-output non fanno parte del linguaggio, sono fornite della libreria) | * il linguaggio C delega tutto il possibile alla libreria standard C (per esempio le operazioni di input-output non fanno parte del linguaggio, sono fornite della libreria) | ||
+ | * il codice generato può non aver bisogno di software di supporto (ambiente di esecuzione) | ||
* il punto e virgola (;) è il terminatore: trasforma espressioni in istruzioni | * il punto e virgola (;) è il terminatore: trasforma espressioni in istruzioni | ||
* un programma è sintatticamente una collezione di funzioni. Tutto ciò che e ''dentro'' è locale, ciò che è fuori è ''globale'' | * un programma è sintatticamente una collezione di funzioni. Tutto ciò che e ''dentro'' è locale, ciò che è fuori è ''globale'' | ||
Line 6: | Line 7: | ||
* gli argomenti delle funzioni sono sempre passati per valore (ma si pu passare per valore l'indirizzo di una variabile, i.e. il suo puntatore) | * gli argomenti delle funzioni sono sempre passati per valore (ma si pu passare per valore l'indirizzo di una variabile, i.e. il suo puntatore) | ||
* un vettore (array) di elementi di tipo T ha il ruolo sintattico di una '''costante''' di tipo T* cioé puntatore a T | * un vettore (array) di elementi di tipo T ha il ruolo sintattico di una '''costante''' di tipo T* cioé puntatore a T | ||
− | * durante la valutazione delle | + | * durante la valutazione delle espressioni numeriche, quando occorre fare una operazione fra due operandi di tipo diverso quello di tipo ''meno importante'' viene convertito (promosso) al tipo dell'altro operando. La sequenza dell' ''importanza'' dei tipi (da quello meno a quello più importante è: ''char, short, unsigned short, int, unsigned, long, unsigned long, float, double, long double''. |
+ | * al momento dell'assegnamento del valore di una espressione numerica a una variabile se necesssario viene convertito il tipo; | ||
+ | * int -> int piu' ampio, estensione segno se il numero e' segnato | ||
+ | * int -> int meno ampio: parte *meno* significativa | ||
+ | * int -> float conversione | ||
+ | * float -> int approssimazione | ||
+ | * float -> float adattamento mantissa (con arrotondamento) | ||
* se p è un puntatore e i è un intero: p[i] è semplicemente una abbreviazione di *(p+i) | * se p è un puntatore e i è un intero: p[i] è semplicemente una abbreviazione di *(p+i) | ||
* se p è un puntatore ad una struttura p->f significa (*p).f | * se p è un puntatore ad una struttura p->f significa (*p).f | ||
* '''for (a; b; c) S''' significa '''a; while (b) {S; c;}''' | * '''for (a; b; c) S''' significa '''a; while (b) {S; c;}''' | ||
* enum è un int, (è solo uno strumento sintattico per scrivere programmi leggibili) | * enum è un int, (è solo uno strumento sintattico per scrivere programmi leggibili) | ||
+ | * char significa intero di 8 bit. | ||
* togliendo le parentesi si ottiene un puntatore: se v[i] è di tipo T, v è di tipo T*. Se f e' una funzione, f seguita dagli argomenti fra parentesi tonde indica la chiamata della funzione mentre f da solo è il puntatore alla funzione. | * togliendo le parentesi si ottiene un puntatore: se v[i] è di tipo T, v è di tipo T*. Se f e' una funzione, f seguita dagli argomenti fra parentesi tonde indica la chiamata della funzione mentre f da solo è il puntatore alla funzione. | ||
* per definire un tipo con '''typedef''' si usa la stessa sintassi che sarebbe necessaria per definire una variabile di tale tipo anteponendo la parola typedef. es: ''int x[10];'' definisce un vettore di 10 elementi int, ''typedef int x[10];'' definisce x come il tipo ''vettore di 10 elementi int''. | * per definire un tipo con '''typedef''' si usa la stessa sintassi che sarebbe necessaria per definire una variabile di tale tipo anteponendo la parola typedef. es: ''int x[10];'' definisce un vettore di 10 elementi int, ''typedef int x[10];'' definisce x come il tipo ''vettore di 10 elementi int''. | ||
* non ci sono controlli automatici a tempo di esecuzione (ad es. indici o puntatori errati) | * non ci sono controlli automatici a tempo di esecuzione (ad es. indici o puntatori errati) | ||
* per generare codice corretto il compilatore deve conoscere il tipo del valore di ritorno delle funzioni | * per generare codice corretto il compilatore deve conoscere il tipo del valore di ritorno delle funzioni |
Latest revision as of 14:57, 28 September 2022
- il C e' conciso (o anche con_C_so): le parole chiave e i simboli degli operatori sono brevi e si evita ogni ridondanza;
- il linguaggio C delega tutto il possibile alla libreria standard C (per esempio le operazioni di input-output non fanno parte del linguaggio, sono fornite della libreria)
- il codice generato può non aver bisogno di software di supporto (ambiente di esecuzione)
- il punto e virgola (;) è il terminatore: trasforma espressioni in istruzioni
- un programma è sintatticamente una collezione di funzioni. Tutto ciò che e dentro è locale, ciò che è fuori è globale
- il programma principale è la funzione di nome main
- gli argomenti delle funzioni sono sempre passati per valore (ma si pu passare per valore l'indirizzo di una variabile, i.e. il suo puntatore)
- un vettore (array) di elementi di tipo T ha il ruolo sintattico di una costante di tipo T* cioé puntatore a T
- durante la valutazione delle espressioni numeriche, quando occorre fare una operazione fra due operandi di tipo diverso quello di tipo meno importante viene convertito (promosso) al tipo dell'altro operando. La sequenza dell' importanza dei tipi (da quello meno a quello più importante è: char, short, unsigned short, int, unsigned, long, unsigned long, float, double, long double.
- al momento dell'assegnamento del valore di una espressione numerica a una variabile se necesssario viene convertito il tipo;
* int -> int piu' ampio, estensione segno se il numero e' segnato * int -> int meno ampio: parte *meno* significativa * int -> float conversione * float -> int approssimazione * float -> float adattamento mantissa (con arrotondamento)
- se p è un puntatore e i è un intero: p[i] è semplicemente una abbreviazione di *(p+i)
- se p è un puntatore ad una struttura p->f significa (*p).f
- for (a; b; c) S significa a; while (b) {S; c;}
- enum è un int, (è solo uno strumento sintattico per scrivere programmi leggibili)
- char significa intero di 8 bit.
- togliendo le parentesi si ottiene un puntatore: se v[i] è di tipo T, v è di tipo T*. Se f e' una funzione, f seguita dagli argomenti fra parentesi tonde indica la chiamata della funzione mentre f da solo è il puntatore alla funzione.
- per definire un tipo con typedef si usa la stessa sintassi che sarebbe necessaria per definire una variabile di tale tipo anteponendo la parola typedef. es: int x[10]; definisce un vettore di 10 elementi int, typedef int x[10]; definisce x come il tipo vettore di 10 elementi int.
- non ci sono controlli automatici a tempo di esecuzione (ad es. indici o puntatori errati)
- per generare codice corretto il compilatore deve conoscere il tipo del valore di ritorno delle funzioni