Vapros kam prof #3
17 отговора
753 прегледа
Vapros kam prof #3
V koda po-dolu kolko shte bade stojnostta na x?
int array[] = {23, 34, 12, 17, 204, 99, 16 };
#define TOTAL_ELEMENTS ( sizeof(array) / sizeof(array[0]) )
int main(int argc, char *argv[])
{
int d = -1, x;
/* .............. */
if ( d <= TOTAL_ELEMENTS-2 )
x = array[d+1];
/* ..............*/
}
int array[] = {23, 34, 12, 17, 204, 99, 16 };
#define TOTAL_ELEMENTS ( sizeof(array) / sizeof(array[0]) )
int main(int argc, char *argv[])
{
int d = -1, x;
/* .............. */
if ( d <= TOTAL_ELEMENTS-2 )
x = array[d+1];
/* ..............*/
}
Re: Vapros kam prof #3
Хммм,
ами sizeof() връща size_t, което е typedef unsigned int size_t.
А пък при сравнение на signed със unsigned signed се преобразува до unsigned, т.е. d ще стане 0xFFFFFFFF (или нещо такова - зависи).
Ама при всички случаи, проверката няма да сработи.
Т.е. x e неопределено
ами sizeof() връща size_t, което е typedef unsigned int size_t.
А пък при сравнение на signed със unsigned signed се преобразува до unsigned, т.е. d ще стане 0xFFFFFFFF (или нещо такова - зависи).
Ама при всички случаи, проверката няма да сработи.
Т.е. x e неопределено
Mnogo dobre
Mnogo dobre si se spravil. Malko hora biha se setili. Mejdu drugoto v Java sashto moje da se predizvika tazi greshka, no maj che tam po-lseno se zabeliazva.
>>>
public class Test {
/** Creates new Test */
public Test() {
}
public void start() {
int array[] = { 23, 45, 67, 88, 90, 87, 78, 100 };
char d = (char)-1, x=0;
if ( array.length-2 >= d )
x = (char)array[d+1];
System.out.println("x = " + x);
}
public static void main(String[] argv) {
Test test = new Test();
test.start();
}
}
<<<
>>>
public class Test {
/** Creates new Test */
public Test() {
}
public void start() {
int array[] = { 23, 45, 67, 88, 90, 87, 78, 100 };
char d = (char)-1, x=0;
if ( array.length-2 >= d )
x = (char)array[d+1];
System.out.println("x = " + x);
}
public static void main(String[] argv) {
Test test = new Test();
test.start();
}
}
<<<
Re: Vapros kam prof #3
A ia ti mi kazi ste se izpulni li tialoto na if-a pri slednia variant :)))
char c = 193;
if(c == 193)
{
/* boza */
}
char c = 193;
if(c == 193)
{
/* boza */
}
Otgovor
Kato izpolzvash Dev-C++ 4.01 (koeto moje da smaknesh bezplanto) za tvoia kod se generira slednia
warning: comparison is always false due to limited range of data type
Taka che tova e otgovora.
warning: comparison is always false due to limited range of data type
Taka che tova e otgovora.
Re: Vapros kam prof #3
ne. no ako go napishesh if ( (unsigned char) c == 193 )
togawa da.
* unsigned char 8 bits 0 to 255
char 8 bits -128 to 127
........................................................................................................
long double 80 bits 3.4 * (10**-4932) to 1.1 * (10**+4932)
*za 16 bits C
togawa da.
* unsigned char 8 bits 0 to 255
char 8 bits -128 to 127
........................................................................................................
long double 80 bits 3.4 * (10**-4932) to 1.1 * (10**+4932)
*za 16 bits C
Re: Otgovor
kompiliran s Borland C++ 3.1 za DOS (koeto moga da ti dam bezplatno -> kradeno e), koda si raboti.
Ne razbiram vaprosa
Ne razbiram kakvo tochno me pitash. Ako dobavish cout << x; stojnostta na x ne e 23.
Fragmetnta ot kod kojto predlagam dava greshka nezavisimo ot standarta poddarajn ot kompilatora. Moje bi ako si go probval imash niakakvi opcii koito fixsvat greshkata, no na druga mashina i s drug kompilator tozi kod moge da
sazdade problem!
Znachi gornia kod moje da se popravi po 2 nachina.
ednia e da se promeni #define na:
#define NUMBER_ELEMENTS (sizeof(array)/sizeof(int))
ili v if - a da slojish
if ( d <= (int)(NUMBER_ELEMENTS)+2 )
Fragmetnta ot kod kojto predlagam dava greshka nezavisimo ot standarta poddarajn ot kompilatora. Moje bi ako si go probval imash niakakvi opcii koito fixsvat greshkata, no na druga mashina i s drug kompilator tozi kod moge da
sazdade problem!
Znachi gornia kod moje da se popravi po 2 nachina.
ednia e da se promeni #define na:
#define NUMBER_ELEMENTS (sizeof(array)/sizeof(int))
ili v if - a da slojish
if ( d <= (int)(NUMBER_ELEMENTS)+2 )
Re: Otgovor
Tova beshe mnogo dobar kompilator na vremeto (1993-4 g.). V momenta moje da smaknesh command line compilator bcc ot site na borland + turbo debugger free of charge. Mislia che kompilatora e v.5.0 (smaknah go predi dve sedmici) no ne go polzvah. Shto se otnasia za 193 v dvoiche vid to e 11000001 t.e. 7-a "znakov" bit opredelia dali tova che se razgledja kato unsigned ili signed char. V BC 3.1 imash edna opcia koiato opredelia dali promenlivite ot tip char da badat po podrazbirane signed or unsigned.
Re: Otgovor
Stom imash chitav kompilator dobre, a mojesh li da kazesh zasto se poluchava tozi warning :))).
Re: Otgovor
A pri tozi variant dava li ti warning?
unsigned char c = 'я';
if(c == 'я')
{
/* boza */
}
Predisnia variant kompiliran s VC++6 (Level 4) dava warning no pri tozi ne. S djgpp mi dava warning i pri dvata varianta, sam si napravi izvoda koi kompilator kakuv e.
unsigned char c = 'я';
if(c == 'я')
{
/* boza */
}
Predisnia variant kompiliran s VC++6 (Level 4) dava warning no pri tozi ne. S djgpp mi dava warning i pri dvata varianta, sam si napravi izvoda koi kompilator kakuv e.
Re: Otgovor
S Dev C++ ne mi dava warning pri tozi variant. Vse pak tova che ne ti dava warning ne znachi kolko efektiven kod generira kompilatora. Edin priatel kojto pishe kompilatori ot 5-6 godini tvardi che djgpp e edin ot neefetivnite kompilatori, sahsto taka watcom c++ ot predi 5-6 godini generira po-dobar kod ot poslednia kompilator na borland. Shto se otnasia do VC++, kolkoto i da mrazim MS tehnia kompilator daval mnogo dobar kod.
Re: Ne razbiram vaprosa
Искаш да кажеш, че ако само сменим
#define NUMBER_ELEMENTS ( sizeof(array) / sizeof(array[0]) )
на
#define NUMBER_ELEMENTS (sizeof(array)/sizeof(int))
нещата ще се оправят, така ли?
Това не е вярно - sizeof(int) ще си върне пак size_t.
Виж долу if-a ако го променим, тогава ще стане.
#define NUMBER_ELEMENTS ( sizeof(array) / sizeof(array[0]) )
на
#define NUMBER_ELEMENTS (sizeof(array)/sizeof(int))
нещата ще се оправят, така ли?
Това не е вярно - sizeof(int) ще си върне пак size_t.
Виж долу if-a ако го променим, тогава ще стане.
Иска да каже, че ако
if ( d <= (NUMBER_ELEMENTS)+2 )
се смени с:
if ( d <= (int)(NUMBER_ELEMENTS)+2 )
ще е сигурно, че ще сработи.
се смени с:
if ( d <= (int)(NUMBER_ELEMENTS)+2 )
ще е сигурно, че ще сработи.
Re: Otgovor
Che koi e kazal che stom ne dava warning generira neefektiven kod.
Ako e greshen coda goliama praz che e optimiziaran dobre :))).
Az ne gi mrazia MS, no naistina kompilatora im e mnogo dobur.
Ako e greshen coda goliama praz che e optimiziaran dobre :))).
Az ne gi mrazia MS, no naistina kompilatora im e mnogo dobur.
Re: Otgovor
Po sluchaya, poredniya bug, koyto dnes otkrih v VC++ 6.0:
class alabala
{
};
class alabalka : alabala
{
enum {alabala, portokala} t;
};
class alabala
{
};
class alabalka : alabala
{
enum {alabala, portokala} t;
};