2015-01-21 13 views
6
typedef struct rem{ 
    int addr; 
    char addrbuf[32]; 
} foo; 

Entrambi questi codici restituire gli stessi risultatiQuando dovremmo usare sizeof con e senza parentesi

foo addr; 
printf("size is: %d\n",sizeof addr); 
printf("size is: %d\n",sizeof (foo)); 

formato è: 36

dimensione è: 36

Ma quando dovremmo utilizzare sizeof con e senza parentesi?

+0

correlati [Che cosa fa sizeof without()?] (Http://stackoverflow.com/q/18898736/1708801) –

risposta

14

Quando si utilizza sizeof con un tipo, è necessario parentesi attorno al tipo. Quando lo si utilizza con un'espressione , non lo si fa. Ma puoi ovviamente includerli anche in questo caso, e in questo caso non devi preoccuparti della precedenza degli operatori. Con operatori non comuni come questo, meno persone sarebbero sicure della precedenza, quindi la chiarezza sicuramente aiuta.

Quindi direi che è preferibile usarli sempre.

+0

Questo è quello che stavo pensando grazie per chiarire il mio dubbio. – cmidi

+7

Nit: a seconda dell'espressione, potresti avere ancora bisogno di parentesi anche in quel momento. 'sizeof a + b' non significa' sizeof (a + b) '. (So ​​che è quello che intendevi anche tu.) – hvd

+0

@hvd Ecco perché ho menzionato (e ora elaborato) la precedenza degli operatori. – Angew

10

[expr.sizeof]/1:

L'operando è o un espressione, che è un non valutata operando (punto 5), o un parentesi tipo-id.

Pertanto le parentesi sono necessarie solo per i tipi. Se preferisci usare le parentesi per chiarezza e coerenza (come faccio io) puoi sempre usarle però, poiché le parentesi intorno a un'espressione formano un'altra espressione .
La precedenza degli operatori di sizeof non è molto nota e potrebbe causare irritazioni.

Inoltre, per l'operatore sizeof..., è sempre necessario utilizzare le parentesi (un altro motivo di coerenza).

+0

causa irritazioni ... come cosa? –

+1

@Meninx Qual è il valore di 'sizeof 1 * 2'? È intuitivo? – Columbo

+0

@Columbo; Da quale standard lo hai citato? – haccks

Problemi correlati