Будет интересно только программистам, знающим 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 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:40 pm (UTC)no subject
Date: 2010-06-26 05:41 pm (UTC)no subject
Date: 2010-06-26 05:42 pm (UTC)no subject
Date: 2010-06-26 05:42 pm (UTC)no subject
Date: 2010-06-26 05:52 pm (UTC)warning C4244: 'argument' : conversion from 'double' to 'char', possible loss of data
no subject
Date: 2010-06-26 05:56 pm (UTC)ЧЯДНТ?
no subject
Date: 2010-06-26 05:56 pm (UTC)double.cc:9: 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>]'
g++ (GCC) 3.4.6
no subject
Date: 2010-06-26 05:57 pm (UTC)no subject
Date: 2010-06-26 05:58 pm (UTC)#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] << endl; string t; char c = (char)((double)123456.789); t = c; cout << "t=" << t << endl; return 0; } $ g++ test.cpp && ./a.out m[0]= t=no subject
Date: 2010-06-26 06:21 pm (UTC)An rvalue of a floating point type can be converted to an rvalue of an integer type. The conversion truncates; that is, the fractional part is discarded. The behavior is undefined if the truncated value cannot be represented in the destination type.
для этого числа undefined, поэтому кому-то собачку, а мне - ноль. Делаем d = 78.7654321 и видим букву N
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:25 pm (UTC)no subject
Date: 2010-06-26 06:27 pm (UTC)cout << "m[0]=" << m[0].size() << " : " << unsigned(m[0][0]) << endl;
no subject
Date: 2010-06-26 06:34 pm (UTC)no subject
Date: 2010-06-26 06:35 pm (UTC)no subject
Date: 2010-06-26 06:36 pm (UTC)no subject
Date: 2010-06-26 06:36 pm (UTC)Ну да, “система типов” C/C++ ужасна, это любой хаскеллист скажет :)))
:)
Date: 2010-06-26 06:42 pm (UTC)Convert.Int2Float, Convert.Ptr2Str and so on and so on...
no subject
Date: 2010-06-26 06:48 pm (UTC)no subject
Date: 2010-06-26 06:49 pm (UTC)#include <string> int main() { double d = 1232342234.789; char c; c=d; return 0; }Если опять сожрет -- убрать include. На чистом присвоении все же должен ругаться. А там -- вычислить, кто и зачем убрал предупреждение.
no subject
Date: 2010-06-26 06:56 pm (UTC)