avva: (Default)
[personal profile] avva
Будет интересно только программистам, знающим 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; }
Page 1 of 4 << [1] [2] [3] [4] >>

Date: 2010-06-26 05:15 pm (UTC)
From: [identity profile] lpetrazickis.livejournal.com
программисты которые не знают C++ хотят знать ответ.

Date: 2010-06-26 05:18 pm (UTC)
From: [identity profile] nmoroz.livejournal.com
Только не говорите, что он найдет какой-то символ по такому числу.

Date: 2010-06-26 05:27 pm (UTC)
From: [identity profile] spamsink.livejournal.com
Чего ж не найти-то?

Date: 2010-06-26 05:36 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Какой символ оно найдёт мне не сообразить, но тут будет double-int-char цепочка.
gcc, гад, даже с -Wall молчит ка крыба об лёд.

Date: 2010-06-26 05:40 pm (UTC)
From: [identity profile] msh.livejournal.com
поскольку operator= бывает для string&, char* и char, d превратится в char с предупреждением от компилятора. Какой конкретно char - не знаю, но явно ничего хорошего

Date: 2010-06-26 05:41 pm (UTC)
nine_k: A stream of colors expanding from brain (Default)
From: [personal profile] nine_k
Если 12, то это form feed, экран должна очистить.

Date: 2010-06-26 05:42 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Ну вот g++ не даёт никаких предупреждений. MS/Intel под рукой нет, через 10 минут попробую в clang, который славится своей ворчливостью и правильностью этой ворчливости, если он вообще такой C++ съест (не факт).

Date: 2010-06-26 05:42 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Получлось 64 — собачка.

Date: 2010-06-26 05:52 pm (UTC)
From: [identity profile] shadow-at-night.livejournal.com
MS выдает
warning C4244: 'argument' : conversion from 'double' to 'char', possible loss of data

Date: 2010-06-26 05:56 pm (UTC)
From: [identity profile] blacklion.livejournal.com
> g++ --version
g++ (GCC) 4.2.1 20070719 [FreeBSD]
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

> g++ -O99 -Wall -o test ./test.cc
> ./test
m[0]=>


ЧЯДНТ?

Date: 2010-06-26 05:56 pm (UTC)
From: [identity profile] msh.livejournal.com
double.cc: In function `int main()':
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

Date: 2010-06-26 05:57 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Ужас-ужас, конечно, но хоть что-то говорит. 4.2.1 — молчит…

Date: 2010-06-26 05:58 pm (UTC)
From: (Anonymous)
#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=

Date: 2010-06-26 06:21 pm (UTC)
From: [identity profile] msh.livejournal.com
Ага, тут уж пришлось читать стандарт


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

Date: 2010-06-26 06:25 pm (UTC)
From: [identity profile] renatm.livejournal.com
Сначала вообще никаких идей не было, и не был уверен, что это вообще компилируется. Решил откомпилировать, но видимо зря, потому что MSVC выдал предупреждение

warning C4244: 'argument' : conversion from 'double' to 'char', possible loss of data

по которому сразу стало ясно, что дабл будет конвертиться в char.

Вообще, я считаю, что в нормальном языке программирования такое не должно компилироваться :)

Date: 2010-06-26 06:25 pm (UTC)
From: [identity profile] senecarus.livejournal.com
Они не программисты.

Date: 2010-06-26 06:27 pm (UTC)
From: [identity profile] itman.livejournal.com
Гораздо интереснее сделать вывод:

cout << "m[0]=" << m[0].size() << " : " << unsigned(m[0][0]) << endl;

Date: 2010-06-26 06:34 pm (UTC)
From: [identity profile] itman.livejournal.com
Ага, а также у строки есть присваивание из char :-(((

Date: 2010-06-26 06:35 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Да мне вот теперь интересно какого чёрта у меня компилятор предупреждение не даёт.

Date: 2010-06-26 06:36 pm (UTC)
From: [identity profile] itman.livejournal.com
Вообще, за неявные преобразования в Сях авторов языка нужно очень и очень ругать. Другое дело, что язык этот создавался в дремучие времена, когда не очень верили в то, что строгая типизация нужна. Да даже и сейчас я вижу много людей, которые бьют себя пяткой в грудь и кричат, что они крутые, поэтому вполне могут писать на скриптовых языках, где преобразуется вообще все во все. В Си++ хоть ограничения есть.

Date: 2010-06-26 06:36 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Вообще, я считаю, что в нормальном языке программирования такое не должно компилироваться :)
Ну да, “система типов” C/C++ ужасна, это любой хаскеллист скажет :)))

:)

Date: 2010-06-26 06:42 pm (UTC)
From: [identity profile] greps.livejournal.com
Ну да, ну да, а потом мы долго и нудно пишем языке программмирования модуль для конвертирования -
Convert.Int2Float, Convert.Ptr2Str and so on and so on...

Date: 2010-06-26 06:48 pm (UTC)
From: [identity profile] rogovsky.livejournal.com
Нормальный компилятор за такое должен руки поотрывать!

Date: 2010-06-26 06:49 pm (UTC)
From: [identity profile] mtyukanov.livejournal.com
Можно проверить на упрощенном:

#include <string>

int main() {

  double d = 1232342234.789;
  char c;
  c=d;
  return 0;
}

Если опять сожрет -- убрать include. На чистом присвоении все же должен ругаться. А там -- вычислить, кто и зачем убрал предупреждение.

Date: 2010-06-26 06:56 pm (UTC)
From: [identity profile] gaus.livejournal.com
Это программисты на С++ не программисты, а шаманы.
Page 1 of 4 << [1] [2] [3] [4] >>

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 03:27 am
Powered by Dreamwidth Studios