2016-07-11 1 views
2

Сколько преобразования типов есть в следующем коде:Сколько конверсий типов содержится в коде?

#include<stdio.h> 
int f(int x) 
{ 
    return (float)x; 
} 
int main() 
{ 
    float x = f(5L); 
    return 0; 
} 

В функции f(), возвращаемое значение переходит из int в float. В main(), аргумент f() показан с int по умолчанию: long и int - еще раз повышена до float.

Правильно ли, что есть три типа конверсий (рекламных акций)?

+3

Поскольку 'x' не используется, оптимизированный компилятор может удалить' float x = f (5L); 'и нулевые преобразования. Помимо этого я вижу изменения типа 4+. – chux

+0

Ни одна из конверсий не является «рекламными акциями». –

+0

Что отличает 'int' от 'float', чтобы вернуть значение из функции' int'? –

ответ

4

Я вижу в общей сложности 4 преобразования типов (ни одна из которых не является «рекламными акциями»).

Внутри f() значение x явно преобразуется из int в float оператором литой, В результате этого преобразования неявно преобразуется из float в int в return заявлении.

Внутри main(), значение константы 5L неявно преобразуется из long int в int, когда она передается в качестве аргумента f. Результат вызова f неявно преобразован из int в float путем инициализации x.

Это четыре преобразования. (The return 0; не влечет за собой преобразование, так как 0 уже типа int, что тип возвращаемого значения для main.)

Учитывая достаточно умный компилятор, вполне вероятно, что ни один из этих преобразований не приведет к какой-либо не - тривиальный сгенерированный код. Поскольку ни одно из значений не используется, вся программа может быть уменьшена до эквивалента

int main(void) { return 0; } 

Но все четыре преобразований происходят в «абстрактной машине», определенной семантикой языка C.

(кстати, int main(void) предпочтительно int main().)

+0

Является ли преобразование из long int в число понижений? – user300046

+0

@display_error: Если вы хотите назвать это так, конечно, но я бы этого не сделал. Стандарт C не использует это слово. Он конкретно определяет термин «* целые рекламные акции *» (см. [N1570] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) 6.3.1.1); в коде в вопросе нет. –

+0

@display_error: Исправление: стандарт C использует слово «понижение», чтобы ссылаться на преобразование с плавающей запятой в J.2, но это неофициальное использование термина в ненормативном тексте. –

2

В f:

int (аргумент) ->float (литье) ->int (возвращаемое значение)

В main:

long (буквальный) ->int (аргумент)

int (возвращаемое значение f) ->float (переменная x)

Это четыре преобразования.

0

Там нет ни одного правильного ответа на этот вопрос - все это зависит от компилятора и используемой системы.

Хороший компилятор будет проходить через все, кроме return 0;, и конверсий вообще не будет.

Даже если компилятор все еще сохраняет функцию, количество преобразований все еще непредсказуемо. Преобразование 5L в int будет разрешено во время компиляции. Поэтому он не должен считаться конверсией. Также во многих системах нет разницы между long и int, так как они являются 32 битами (на многих системах), которые снова предполагают, что это не преобразование.

В большинстве систем, уродливое (float) литого вызывая int->float->int должен остаться как float не может представлять все значения в int. Но если система использует формат float, который может представлять все значения int, компилятор может пройти через конверсии. int->float в основном должен остаться.

Так что я бы сказал, что конверсии 0, 1 или 3. С 0 наиболее вероятно при компиляции с оптимизацией.

Но реальный ответ - это зависит от системы и компилятора.