PDA

View Full Version : [C++]C++ e i suoi misteri


rnuzzo
05-04-2009, 17:20
Ciao a tutti sto studiando il c++ e devo dire che il mal di testa non passa mai ( e sto iniziando ora!) mi spiegate perche questo programma se compilato cosi' funziona


#include<iostream>
using std::cout;
using std::cin;
using std::endl;

int main()
{
char ch;

cout << "Benvenuto nel programma convertitore" << endl << endl;

cout << "Inserisci un carattere ( . per uscire): ";

cin >> ch;

while (ch != '.')
{

if (ch >= (char)(ch + 32))
{
cout << "In maiuscolo sara': " << (char)(ch - 32) << endl << endl;
}
else
{
cout << "In minuscolo sara': " << (char)(ch + 32) << endl << endl;
}


cout << "Inserisci un carattere ( . per uscire): ";
cin >> ch;
cout << endl;
}

getchar();

return 0;
}

mentre cosi' no?



#include<iostream>
using std::cout;
using std::cin;
using std::endl;

int main()
{
char ch;

cout << "Benvenuto nel programma convertitore" << endl << endl;

cout << "Inserisci un carattere ( . per uscire): ";

cin >> ch;

while (ch != '.')
{


if (ch >= ch + 32)
{
cout << "In maiuscolo sara': " << (char)(ch - 32) << endl << endl;
}
else
{
cout << "In minuscolo sara': " << (char)(ch + 32) << endl << endl;
}


cout << "Inserisci un carattere ( . per uscire): ";
cin >> ch;
cout << endl;
}

getchar();

return 0;
}

Una variabile char non è comunque trattata come una short int ?

stdecden
05-04-2009, 17:31
Stai attento però che "ch >= (char)(ch + 32)" sarà sempre falso, quindi l'if non ti serve nemmeno

rnuzzo
05-04-2009, 17:45
e vero:doh:

rnuzzo
05-04-2009, 17:53
pero il prog funziona

PGI-Bis
05-04-2009, 19:25
"ch >= (char)(ch + 32)"

E' sempre vero per ogni ch > MAX - 32, con MAX valore massimo di un char (cioè 2 elevato alla 8 * sizeof(char)).

Questo invece:

ch >= ch + 32;

con ch tipo char è sempre falso per via della promozione numerica se sizeof(int) > sizeof(char) [ps. le specifiche c infatti non escludono che un char possa avere la stessa dimensione di un int ma dicono solo che un int non può avere dimensione inferiore a un char).