2013-05-07 12 views
8
#include <stdio.h> 
int main()   
{ 

      short int i = 20; 

      char c = 97; 

      printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i)); 
      return 0; 
} 

Może ktoś mi powiedzieć, co się dzieje, gdy sizeof (a + b) "jest krótki int typ & b jest char typu" wyjściowa wynosi: 2, 1, 4Co się tutaj dzieje? sizeof (short_int_variable + char_variable)

+0

'sizeof 'jest konstrukcją czasu kompilacji. –

+0

rozmiar wyniku jest obliczany jako int – BLUEPIXY

+0

Nie wspomniałeś jeszcze, że sizeof (c + c) również da 4, więc będzie sizeof (c/2) lub sizeof (1998) – Kartikya

Odpowiedz

8

Ponieważ C na standardowy integral promotion rules, rodzaj ekspresji c + i jest int, więc dlatego dostajesz odpowiednik sizeof (int).

Należy zauważyć, że sizeof nie jest funkcją, nawias jest potrzebny tylko podczas nadawania nazwy typowi and to resolve precendence conflicts. Kod coule być napisane:

printf("%zu, %zu, %zu\n", sizeof i, sizeof c, sizeof (c + i)); 

Ostateczne wykorzystanie sizeof ma nawiasów od sizeof wiąże mocniej niż + mówiąc sizeof c + i będzie analizowany jako (sizeof c) + i który nie jest pożądany rezultat.

Należy również zauważyć, że w większości przypadków jest to konstruowanie w czasie kompilacji, wyrażenie nigdy nie jest faktycznie oceniane. Wszystko, co się dzieje, to to, że kompilator "udaje", aby go ocenić, aby określić typ wyrażenia, a następnie podaje rozmiar wartości tego typu. Rzeczywista wartość nigdy nie musi istnieć, co czasami jest zadowalające.

Typ wartości powrotu sizeof jest size_t, który jest wydrukowany za pomocą %zu (nie jest int).

+0

A jak już zostało to stwierdzone gdzie indziej, aby uniknąć pomyłki, zawsze umieszczaj odstęp między "sizeof" a nawiasem otwierającym. (Ja tylko robię tę dowcipną konwencję jawną dla czytelnika) – Rerito

+1

kod powinien być 'printf ("% zu,% zu,% zu \ n ", sizeof i, sizeof c, sizeof (c + i));' ponieważ ['sizeof' nie zwraca' int'] (https://stackoverflow.com/q/940087/995714) –

+0

@ LưuVĩnhPhúc Absolutnie, dzięki za poprawienie tej starej odpowiedzi. Edytowane, oczywiście. – unwind

0

sizeof działa tylko w czasie kompilacji, aby uzyskać rozmiar wyrażenia.

Poniżej przyzwyczajenie faktycznie zwiększyć 'C'

sizeof C = C (++);

sizeof wyrażenie (a + b) zwróci największą typ z unsigned mającego pierwszeństwo

4
1) sizeof(i) ==> sizeof(short int) = 2 

2) sizeof(c) ==> sizeof(char) = 1 

3) sizeof(c + i [97+20]) ==> sizeof(int) = 4 // result in constant value which is int as default 
+0

downvotter. proszę wyjaśnić, co rozumiem źle? Poprawię mnie .. – Mani

+0

* "Wynik w stałej wartości, która jest int domyślnie" * - Huh? Nawet nie rozumiem, o czym mówisz. –

+0

@ChristianRau Mówię o '(c + i)', co daje stałą wartość, która domyślnie jest traktowana jako 'int'. – Mani

0

Typ danych a ma wartość "short int". -32768 ~ +32767

Typ danych c to "char". 0 ~ 255

Gdy dodać do c to nie jest albo short int ani char, staje int!

Oto jest przykład kodu, który pomoże Ci uzyskać zmienną typu danych:

#include <typeinfo> 

int main() 
{ 
    short int a = 1; 
    char c = 'A'; 
    std::cout << typeid(a + c).name() << std::endl; 

    return 1; 
} 
+0

"Krótki" ma zakres od -32768 do 32767. – Lindydancer

+0

Masz rację ... Popełniłem błąd. –

1

Jak inni powiedzieli, sizeof jest obliczana w czasie kompilacji.

Tutaj wartość wyrażenia c + i całkowitej, jak C oraz I są promowane (integralnej promocji) na INT, a tym samym

sizeof(c + i) 

daje 4 bajty na 32-bitowym komputerze ..

Powiązane problemy