автоматическое приведение (или нет?) в с - PullRequest
1 голос
/ 21 июня 2010

Я пытаюсь изучить C на фоне Ruby / PHP / Java, и обнаружил, что вы почти всегда явно приводите вещи (по крайней мере, в учебных пособиях). Мол, я всегда вижу такие вещи, как

double x, y;
x = 1.0; 
/*...*/
y = x*5.0;

Однако, похоже, что на моей версии GCC для моего Mac работает автоматическое приведение.

Оставить .0 на вещах - это просто вопрос стиля, или некоторые компиляторы C не работают автоматически?

Ответы [ 3 ]

8 голосов
/ 21 июня 2010

Константа имеет тип, которому она назначается:

int i = 1;
double x = 2; // 2.0

явное приведение:

i = (int)x;
x = (double)i;

неявное приведение:

i = x;
x = i;

продвижение типа:

x = i / 2.0; // i is promoted to double before being multiplied
x = (double)i / 2.0; // so evaluates as this

против

x = i / 2; // i is not promoted because 2 is an int
x = (double)( i / 2 ); // so evaluates as this
3 голосов
/ 21 июня 2010

Когда неявное приведение небезопасно (может привести к потере битов или точности), ваш компилятор должен предупредить вас, если вы не установили слишком низкий уровень предупреждения.Удивительно, но в VC ++ это означает уровень предупреждения 4, когда по умолчанию установлено значение 3.

Явное приведение будет подавлять такие предупреждения, это способ сообщить компилятору, что вы делаете это намеренно.Если вы свободно применяете приведение типов, не думая, что вы не допустите, чтобы компилятор предупреждал вас, когда потенциальная потеря данных или точность не преднамеренная.

Если вам необходимо выполнить приведение, вы должны подумать, соответствуют ли ваши данныеимеет соответствующий тип для начала.Иногда у вас нет выбора, или это удобный способ адаптации к стороннему коду.В таких случаях может быть дан пояснительный комментарий, чтобы прояснить, что вы действительно думали об этом, а не просто применяете каст.

1 голос
/ 21 июня 2010

Автокастинг работает только тогда, когда вы добавляете точность (или, по крайней мере, не теряете ее), например int -> float, int -> char, char -> int.

Чтобы пойти по другому пути, необходимо выполнить приведение, поскольку программист должен решить, как потерять точность. Как правило, это делается с помощью настила пола, но в определенных приложениях может потребоваться случайный настил и потолок.

Уход .0 - это не вопрос стиля. Это может быть важно; попробуйте отобразить 3/5 и 3.0 / 5.0. Они очень разные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...