Vapros kam prof #3

17 отговора 753 прегледа
#1

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];

/* ..............*/

}

Отговор
в отговор на C Prgm #2

Re: Vapros kam prof #3

Хммм,
ами sizeof() връща size_t, което е typedef unsigned int size_t.
А пък при сравнение на signed със unsigned signed се преобразува до unsigned, т.е. d ще стане 0xFFFFFFFF (или нещо такова - зависи).
Ама при всички случаи, проверката няма да сработи.
Т.е. x e неопределено

Отговор
в отговор на josarjan #3

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();
}
}

<<<

Отговор
в отговор на C Prgm #4

Re: Mnogo dobre

Obiasni togawa slenia fakt: ... cout << x; x = 23 ?

Отговор
в отговор на C Prgm #5

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 */
}

Отговор
в отговор на n/a #6

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.

Отговор
в отговор на n/a #7

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

Отговор
в отговор на C Prgm #8

Re: Otgovor

kompiliran s Borland C++ 3.1 za DOS (koeto moga da ti dam bezplatno -> kradeno e), koda si raboti.

Отговор
в отговор на none #9

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 )

Отговор
в отговор на none #10

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.

Отговор
в отговор на C Prgm #11

Re: Otgovor

Stom imash chitav kompilator dobre, a mojesh li da kazesh zasto se poluchava tozi warning :))).

Отговор
в отговор на C Prgm #12

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.

Отговор
в отговор на n/a #13

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.

Отговор
в отговор на C Prgn #14

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 ако го променим, тогава ще стане.

Отговор
в отговор на josarjan #15

Иска да каже, че ако

if ( d <= (NUMBER_ELEMENTS)+2 )

се смени с:

if ( d <= (int)(NUMBER_ELEMENTS)+2 )

ще е сигурно, че ще сработи.

Отговор
в отговор на C Prgm #16

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.

Отговор
в отговор на n/a #17

Re: Otgovor

Po sluchaya, poredniya bug, koyto dnes otkrih v VC++ 6.0:

class alabala
{
};

class alabalka : alabala
{
enum {alabala, portokala} t;
};

Отговор