2014-09-06 3 views
1

Мы знаем, что типы повышаются. Например, если вы пишете:Порядок продвижения на языках C-типа

int i = 2; 
double d = 4.0; 
double result = i/d; 

. , , то int будет повышаться до double, в результате получится 0.5. Однако я не смог найти никакой информации о том, что произойдет, если конфликт интересов в области рекламы и оценки (это также удивительно сложно для Google). Например:

int i = 2; 
int j = 4; 
double d = 1.0; 
double result = d * i/j; 

В этом примере это значение зависит от того, когда происходит продвижение по службе. Если i получает повышение до деления, тогда результат будет 0.5, но если результат i/j повысится, то произойдет деление целого числа, и результат будет 0.0.

Является результатом того, что происходит правильно? Это то же самое на языках C++ и других языках C?

+0

«если конфликт интересов в области рекламы и оценки» - как вы думаете, что они могут конфликтовать? – mafso

ответ

2

Является результатом того, что происходит четко определено?

Да.

Это то же самое на языках C++ и других языках C?

Для C++ - да. Но «C-производные языки» не так четко определен, поэтому ответить трудно.

Порядок оценки

d * i/j 

является

(d * i)/j 

Итак, первый i получает звание double из-за d * i.

Затем результат (double) должен быть разделен на j, поэтому j повысился на double. Итак, есть две рекламные акции.

Однако для

d + i/j 

порядок операций отличается. Во-первых, деление i/j осуществляется с использованием целочисленной арифметики, а затем в результате получается double. Так что есть только одна промо-акция.

1

Я считаю, что продвижение по службе аналогично порядку операций. Когда компилятор видит строку

double result = d * i/j; 

он ломает линию вниз в:

double result; 
result = d * i; 
result = result/j; 

до трансформации его в машинный код.

Смежные вопросы