2017-02-21 3 views
-4

Я видел следующие примеры в test your c (Автор: Yashvant Kanetkar).Почему оператор sizeof() разный в C

В следующем примере sizeof() дает выходные данные 8.

#include<stdio.h> 

double d; 

int main() 
{ 
(int)(float)(char)d; 
printf("%d\n",sizeof(d)); 
} 

Но во втором примере, sizeof() дает выход 4.

#include<stdio.h> 

double d; 

int main() 
{ 
printf("%d\n",sizeof((int)(float)(char)d)); 
} 

Почему оба выхода отличаются? В книге нет объяснений.

+6

'(INT) (с плавающей точкой) (символ) д;' В первом например, эта строка не действует. Таким образом, он заканчивается как 'sizeof (double)'. Во втором примере у вас есть 'sizeof (int)'. – DeiDei

+2

Пожалуйста, бросьте эту книгу, это не учит вам ничего полезного. –

+2

Не только '(int) (float) (char) d;' не влияет на ваше последующее использование 'sizeof'; это не имеет никакого значения *. это бессмысленная строка кода. Разумный компилятор C с достаточно высокими предупреждениями даст вам намек на этот эффект; clang, например, «main.c: 16: 5: Результат выражения не используется» – WhozCraig

ответ

9

Первый случай эквивалентен sizeof(double). Броски, бесполезны там. эффективный тип d остается без изменений. Компиляция кода с поддержкой надлежащего предупреждения и вы увидите некоторые предупреждения как

предупреждение: заявление при отсутствии эффекта [-Wunused значение]

Второй эквивалентно sizeof(int), что слепки эффективный.

Вы видите результаты (размер int или double) на основе вашей платформы/среды.

Это говорит,

  • sizeof дает результат типа size_t, вы должны использовать %zu спецификатор формата для печати результата.
  • Соответствующая подпись для main() в размещенной среде: int main(void), по крайней мере.
1

В первом случае оператор sizeof возвращает размер double. Во втором случае он возвращает размер int.

Причина

В первую очередь,

(int)(float)(char)d; //This doesn't do anything effective. 
printf("%d\n",sizeof(d)); //d is still `double`. 

Во втором случае,

//You are type casting d to float and then to int and then passing it to the operator sizeof which now returns the size of int. 
printf("%d\n",sizeof((int)(float)(float)d)); //d is `int` now when passed to `sizeof`.