PDA

Visualizza la versione completa : C++, maturitÓ


amodio10
24-06-2008, 14:59
Durante la mia terza prova di maturitÓ, il professore esterno venuto nella mia scuola, ci ha dato questo quesito:

Cosa compare a video dopo l'esecuzione di questo programma:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{

int a=1,x,z;

cout << (z=0 && x!=4 && a++) << endl;
cout << (a<2 && x!=(4 && z >-1 )) << endl;
getchar();

}


Dopo averlo tirato in mezzo per tre ore, mi ha confermato che compariva:

01

In realtÓ compare:

0
1

Dopo vari tentativi non sono ancora riuscito a capire cosa faccia comparire "1".
Confido nel vostro sapere per una risposta.

Grazie

GreyFox86
24-06-2008, 15:07
Il secondo cout stampa il risultato di quell'espressione booleana. Se la valuti vedi che risulta vera, quindi il risultato Ŕ 1.

pallinopinco
24-06-2008, 15:13
Per˛ la variabile x non viene inizializzata, se x valesse 1 il programma fornirebbe in uscita:

0
0

GreyFox86
24-06-2008, 15:22
Ma in c++ le variabili non vengono inizializzate automaticamente a 0? Mi pareva di si :master:

pallinopinco
24-06-2008, 15:24
Ma in c++ le variabili non vengono inizializzate automaticamente a 0? Mi pareva di si


Prova a stampare il valore di x (variabile locale, non globale).



#include <iostream>

using namespace std;

int main(void)
{
int x;
cout << "x vale " << x << endl;
return 0;
}

mondobimbi
24-06-2008, 15:50
Originariamente inviato da GreyFox86
Ma in c++ le variabili non vengono inizializzate automaticamente a 0? Mi pareva di si :master:

le variabili dichiarate static sono inizializzate a zero, altrimenti Ŕ indefinito (rimane quello che c'era giÓ)
ciao
sergio

GreyFox86
24-06-2008, 16:03
Ah giusto le static ma anche i campi delle classi se non sbaglio.
Il codice di pallinopinco senza inizializzazione stampa 0 lo stesso per˛ penso che dipenda dall'implementazione del compilatore.
Nel caso del codice di amodio10 "z" Ŕ inizializzato cmq, dalla prima espressione cout. In effetti manca solo ad "x" l'inizializzazione.

mondobimbi
24-06-2008, 16:07
non dipende dalla implementazione del compilatore e che probabilmente uno zero Ŕ giÓ presente in quella locazione di memoria.
ciao
sergio

GreyFox86
24-06-2008, 16:16
Hai ragione, era un caso fortuito :D
Tanto per divertircisi un po':


gr3yfox test $ cat o.cpp
#include<iostream>

using namespace std;

int main(int argc, char **argv) {
{
int x = -143;
cout << &x << " " << x << endl;
}
{
int x;
cout << &x << " " << x << endl;
}
int x;
cout << &x << " " << x << endl;

}

gr3yfox test $ g++ o.cpp -o o -O0 && ./o
0x7fffed34e0d0 -143
0x7fffed34e0cc 0
0x7fffed34e0d4 32767
gr3yfox test $ g++ o.cpp -o o -O1 && ./o
0x7fff1fe34bc0 -143
0x7fff1fe34bc0 -143
0x7fff1fe34bc4 32767


Le tre variabili x differenti se compilate senza ottimizzazioni finiscono in celle differenti, mentre se si ottimizzza il compilatore riesce a capire che le prime due possono condividere lo stesso indirizzo.

amodio10
24-06-2008, 18:56
Grazie a tutti ragazzi.....grazie hai vostri ragionamenti ho capito dove sbagliavo.....non facevo l'And e non capivo......inoltre in realtÓ (mi Ŕ venuto in mente dopo) le variabili erano dichiarate globale quindi sono inizializzate a 0 (se non mi sbaglio)....grazie mille

Ciauz

Loading