#c #type-conversion
Вопрос:
Кто-нибудь может объяснить, что означают строки 5 и 7?
int a;
double b = 2.3;
a = b;
cout << a << endl;
a = int(b); // <-- here
cout << a << endl;
a = (int)b; // <-- here
cout << a << endl;
Комментарии:
1. Это стили (1) и (2) здесь явного преобразования типов . Они эквивалентны и состоят из нескольких возможных преобразований, предпринимаемых последовательно. В этом случае
static_cast
это то, что на самом деле преобразуется из double в int.2. @Shadman Ehsan Они означают то же самое, что и a = b;.:)
3. Строка 5:
a=int(b);
Это приводит переменнуюb
к целому числу и сохраняет результатa
. Посколькуb
это произойдетdouble
, результат будет ошеломлен. Строка 7:a=(int)b
Это известно как явное приведение в стиле «C». Это имеет тот же эффект, что и в строке 5, но нет никаких гарантий, что результат будет действительным (в этом случае все будет в порядке, но вы не можете просто привести какой- либо тип к другому и ожидать, что он будет работать так, как задумано, если для этих типов не определены преобразования типов).4. Похоже, у вас это есть, поскольку вы знаете термин «актерский состав». В строках используется приведение двойного b в стиле C к int.
5. @h0r53 — чтобы было ясно, нет никакой гарантии, что любое из трех преобразований (строки 3, 5 и 7) из double в int будет действительным, хотя со значением, присвоенным в строке 2, все три будут в порядке. Форма преобразования не имеет значения.
Ответ №1:
Это называется литьем в стиле C и не рекомендуется использовать в c , потому что это может привести к потере точности. Здесь происходит то, что тип double представлен в памяти как структура, содержащая всю часть и плавающую часть. И когда вы говорите a = int(некоторое переменное имя, которое фактически равнозначно), требуется только вся часть этой переменной и присваивает ее a. Так, например, если у вас b = 2,9; и вы хотите взять только всю часть числа, вы можете выполнить приведение в стиле c. Но поскольку вы написали приведение типов C для таких случаев, я рекомендую вам использовать a = static_cast(b); Но будьте осторожны, потому что при выполнении сужающего приведения(приведение от большего типа к более узкому типу) вам нужно быть осторожным, чтобы не потерять точность.