Gå til innhold

Spørsmål om C++


Anbefalte innlegg

Heisann!

 

De siste dagene har jeg prøvd å sette meg inn i C++, og det har i den anledning dukket opp et par spørsmål som jeg ikke helt har klart å finne svaret på. Håper at noen her kan hjelpe meg litt med dette.

 

1. Hva er forskjellen på en litteral konstant og en symbolsk konstant?

 

2. Hvilken verdi får den første symbolske konstanten i en enumerasjon hvis den ikke blir spesifisert?

 

3. Er litterale konstanter regnet for å være r-verdier eller l-verdier?

 

4. Er det signerte eller usignerte heltall representere verdier som kan være negative?

 

:innocent:

Lenke til kommentar
Videoannonse
Annonse

1. Hva er forskjellen på en litteral konstant og en symbolsk konstant?

Aner ikke

 

2. Hvilken verdi får den første symbolske konstanten i en enumerasjon hvis den ikke blir spesifisert?

Derivert "aner ikke"

 

3. Er litterale konstanter regnet for å være r-verdier eller l-verdier?

Alle konstanter er vel r-verdier

 

4. Er det signerte eller usignerte heltall representere verdier som kan være negative?

Signerte

Endret av GeirGrusom
Lenke til kommentar
Ah, nå skjønte jeg nummer 2 :D

Den får 1, det er jo forsåvidt bare å teste da :)

 

Den får 0:

 

If the first enumerator has no =, the value of its enumeration constant is 0.

Each subsequent enumerator with no = defines its enumeration constant as the

value of the constant expression obtained by adding 1 to the value of the

previous enumeration constant. (The use of enumerators with

= may produce enumeration constants with values that duplicate other values in the same

enumeration.)

 

... det er jo forsåvidt bare å teste da.

Lenke til kommentar

Symbolske konstanter er aldri en del av selve maskinkoden etter en kompilator har kompilert programmet ditt. Før kompilatoren kompilerer kildekoden din til maskinkode, bytter den (rekursivt) ut alle symbolske konstanter med sin verdi. Det er dette som kalles preprocessing. F eks så leser gcc -

#define NMSG	500
#define MSGSZ   200
#define BLOCKSZ 64
#define MAXFRAG (MSGSZ/BLOCKSZ + MSGSZ%BLOCKSZ?1:0)
#define NBLOCKS (MAXFRAG*NMSG)

typedef struct message
{
int	  id;
int	  ctime;
int	  mtime;
block_t *blocks[MAXFRAG];

} message_t;


typedef struct block
{
char data[BLOCKSZ];
} block_t;

typedef struct mem
{
message_t msgs[NMSG];
block_t   blocks[NBLOCKS];
} mem_t;

Den bytter så ut alle de symbolske konstantene med sine verdier rekursivt til det ikke er fler igjen i kildekoden til den ser sånn her ut -

typedef struct message
{
int	  id;
int	  ctime;
int	  mtime;
block_t *blocks[(200/64 + 200%64?1:0)]; /* 4 */

} message_t;


typedef struct block
{
char data[64];
} block_t;

typedef struct mem
{
message_t msgs[500];
block_t   blocks[(200/64 + 200%64?1:0)*500]; /* 2000 */
} mem_t;

Og så kompilerer den. Det er nok ikke så enkelt, men i prinsippet...

Endret av LostOblivion
Lenke til kommentar
En ting jeg har lurt litt på, men aldri lurt nok på til å faktisk sjekke, vil f.eks. const int bli lagt på stacken som en vanlig variabel, eller vil den bli "limt" inn i koden som om den var preprocessor verdi?

 

Det er kompilatoravhengig. På en arkitektur der det er lett å lage store immediates OG man bruker store konstanter, ville de antageligvis bli "limt inn" i koden. På en arkitektur der å lage en stor konstant er vanskelig, så er det ikke utenkelig at den blir lagt inn som en global variabel og blir referert til som om den var en slik variabel i koden (bl.a. noen ARM-kompilatorer gjør det).

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...