Будет интересно только программистам, знающим C++.
Небольшая загадка. Предугадайте, что напечатает следующая программа, не запуская ее. Потом проверьте себя, если интересно. Комменты не скрываются.
Небольшая загадка. Предугадайте, что напечатает следующая программа, не запуская ее. Потом проверьте себя, если интересно. Комменты не скрываются.
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
map<int, string> m;
double d = 123456.789;
m[0] = d;
cout << "m[0]=" << m[0];
return 0;
}
no subject
Date: 2010-06-26 05:15 pm (UTC)no subject
Date: 2010-06-26 06:25 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2010-06-26 05:18 pm (UTC)no subject
Date: 2010-06-26 05:27 pm (UTC)no subject
Date: 2010-06-26 05:36 pm (UTC)gcc, гад, даже с -Wall молчит ка крыба об лёд.
no subject
Date: 2010-06-26 05:41 pm (UTC)(no subject)
From:no subject
Date: 2010-06-26 08:15 pm (UTC)warning: passing `double' for converting 1 of `std::basic_string
warning: passing `double' for converting 1 of `std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]'
(no subject)
From:(no subject)
From: (Anonymous) - Date: 2010-06-26 10:52 pm (UTC) - Expandno subject
Date: 2010-06-26 05:40 pm (UTC)no subject
Date: 2010-06-26 05:42 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From: (Anonymous) - Date: 2010-06-26 05:58 pm (UTC) - Expand(no subject)
From:(no subject)
From:no subject
Date: 2010-06-26 06:25 pm (UTC)warning C4244: 'argument' : conversion from 'double' to 'char', possible loss of data
по которому сразу стало ясно, что дабл будет конвертиться в char.
Вообще, я считаю, что в нормальном языке программирования такое не должно компилироваться :)
no subject
Date: 2010-06-26 06:36 pm (UTC)Ну да, “система типов” C/C++ ужасна, это любой хаскеллист скажет :)))
(no subject)
From: (Anonymous) - Date: 2010-06-26 09:41 pm (UTC) - Expand(no subject)
From:...
From:Re: …
From:Re: …
From:Re: …
From:no subject
Date: 2010-06-26 06:36 pm (UTC)no subject
Date: 2010-06-26 08:11 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From::)
Date: 2010-06-26 06:42 pm (UTC)Convert.Int2Float, Convert.Ptr2Str and so on and so on...
Re: :)
Date: 2010-06-26 08:49 pm (UTC)no subject
Date: 2010-06-26 06:48 pm (UTC)no subject
Date: 2010-06-26 07:52 pm (UTC)Tолько не отрывает, и вообще только ворнинг выдает... Я, на самом деле, не могу понять, почему он превращает эту фигню в char.
(no subject)
From:(no subject)
From:no subject
Date: 2010-06-26 08:18 pm (UTC)no subject
Date: 2010-06-27 08:13 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2010-06-26 08:18 pm (UTC)no subject
Date: 2010-06-26 08:43 pm (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2010-06-26 08:45 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2010-06-26 08:53 pm (UTC)no subject
Date: 2010-06-26 10:29 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2010-06-26 10:22 pm (UTC)...
Date: 2010-06-27 06:32 am (UTC)Это класс расширения стандарта языка из STL.
И здесь очень часто многое прокатывает.
Хоть чего делай.
...
А потому то что напечатало - не удивился.
Впрочем даже и в отладчике не исследовал.
Вот это напечатало: m[0]=@.
no subject
Date: 2010-06-27 08:05 am (UTC)И почему я ожидал, что в m[0] окажется какое-нибудь строковое представление вещественного числа?.. %) Давно не программировал на сем, использовал здравый смысл.
no subject
Date: 2010-06-27 11:57 am (UTC)> ./stam.out | od -bc 0000000 155 133 060 135 075 000 m [ 0 ] = \0 0000006 >no subject
Date: 2010-06-27 12:26 pm (UTC)Какой-то из конструкторов string-а который принимает size_t или int (кажется, он инициализует пустой стринг такой длинны или резервирует данное кол-во места) почему-то не объявлен как explicit, и с помощью двойного неявного преобразования (разве такое бывает?!) double->int/size_t->string создаст пустой или длинный стринг из пробелов(?), который и поместит в map.
no subject
Date: 2010-06-27 12:30 pm (UTC)http://www.cplusplus.com/reference/string/string/string/
http://www.sgi.com/tech/stl/basic_string.html
Пойду компилировать и смотреть. Блин, а я то думал, что неплохо в тонкостях с++ разбираюсь :)
(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2010-06-27 02:36 pm (UTC)int a[10];
a[4] = 1; /* ok */
4[a] = 1; /* also ok, does the same */
/* Hint: compiler interprets a[b] as *(a+b) */
no subject
Date: 2010-06-29 09:21 am (UTC)The fundamental types can be converted into each other in a bewildering number of ways. In my opinion, too many conversions are allowed.
И об'ясняет, как такой conversion (double→char) работает:
...conversion from a floating-point type to an integer type truncates. ... The behavior is undefined if the truncated value cannot be represented in the destination type. ... Conversions from integer to floating types are as mathematically correct as the hardware allows. Loss of precision occurs if an integral value cannot be represented exactly as a value of the floating type.
no subject
Date: 2010-06-29 09:22 am (UTC)no subject
Date: 2010-07-01 03:03 pm (UTC)будет недостаточно?
no subject
Date: 2010-07-06 07:29 am (UTC)m[0] = d; - при исполнении выглядит как
string& x = m.operator[](0); // что само по себе очень странно
x.ctor((char)d); // пустой блок памяти вернулся, вызывается ктор
ну, а 123456.789 транформируется в 123456 = 0x0001e240, последний байт = 40 = '@'
Очередной отличный выстрел в ногу.
no subject
Date: 2010-07-06 07:31 am (UTC)(no subject)
From: