-
Продолжаем тему для студентов......
[I]
[B]Программист-стажер[/B]
Для работы в проектах по разработке и внедрению ERP систем мы ищем желающих учиться и быть лучшими!
Требования:
- базовые знания теории БД;
- базовые знания SQL;
- опыт разработки программного обеспечения.
Резюме слать в [email][email protected][/email] Олегу Эдуардовичу
[/I]
-
Константин, правильно.
вот еще ситуация когда он не будет работать
int j,i=1;
j=MAX(i,++i);
а на первый мой вопрос можешь ответить?
у меня еще таких штук восемь.
если да, то контракт у тебя в кармане. :-)
-
[quote=Ull9]
а на первый мой вопрос можешь ответить?
[/quote] Этот ??[quote]
here is a simplest test of c++ :)
what value of i will be, after the following code?
int i=1;
i=i+++i;[/quote]
i+++i эквивалентно (i++)+i
ответ писать ?? :)
[quote]
у меня еще таких штук восемь.
если да, то контракт у тебя в кармане. :-)[/quote] хм .. я всегда считал, что на собеседовании вопросы задают посущественнее..
или тут вся соль в слове "контракт" :)
-
[QUOTE=Пилигрим]Этот ??
i+++i эквивалентно (i++)+i
ответ писать ?? :)
[/QUOTE]
напиши ответ, напиши.
а я посмотрю, посчитаю сам и проверю.
-
[QUOTE=Пилигрим]
хм .. я всегда считал, что на собеседовании вопросы задают посущественнее..
[/QUOTE]
а ты ответь сначала, а потом будешь судить о существенности вопроса.
-
[QUOTE=Ull9]напиши ответ, напиши.
а я посмотрю, посчитаю сам и проверю.[/QUOTE]
тогда выполняю роль дебаггера :
int i=1;
i=i+++i разбивается на следущие этапы:
i++ - результат =1, i после этой операции =2
далее
1+2
и того
"value of i will be" 3.
З.Ы. на такие вещи, как ни странно, у нас в универе еще на 1-ом курсе на лекция обращали внимание...
З.Ы.Ы. блин какой же хреновый резалт выходит, когда надо что-то СРОЧНО написать на ++, а последнюю прогу на ++ писал почти пол года назад...
[QUOTE] а ты ответь сначала, а потом будешь судить о существенности вопроса.[/QUOTE]
Существенность этого вопроса - знание приоритетов операций в ++(уровней которых, если мне не изменят моск, 11 кажись в ++)
-
Подскажите пожалуйста где можно достать исходник IDEA на VSC++? Если у кого-нибудь есть сбросьте плиз на ящик.
-
[QUOTE=Ull9]Константин, правильно.
вот еще ситуация когда он не будет работать
int j,i=1;
j=MAX(i,++i);
а на первый мой вопрос можешь ответить?
у меня еще таких штук восемь.
если да, то контракт у тебя в кармане. :-)[/QUOTE]
Попробую))
here is a simplest test of c++
what value of i will be, after the following code?
int i=1;
i=i+++i;
Интересная ситуация, и дело здесь не только в приоритете, но и в разбивке при лексическом анализе. Честно говоря, я только смутно что-то помнил об этом, и засомневался в решении Piligrim. Этот пример заставил меня скачать стандарт iso c++
[url]http://anatolix.naumen.ru/files/books/CPPStandard2003.zip[/url]
страница 11(по оглавлению стандарта)
В общем, если у нас непрерывная строка - i+++i, то после "i" следующий обрабатываемый токен - максимальный, который можно сформировать;
то есть i+++i = i++ + i;
чтобы наглядно убедиться в этом,
int i = 2
int a = 12
i = a+++i;
cout <<"a = " <<a<<"i = "<<i<<endl;
a = 13 i = 14
решение Piligrim даёт правильный ответ, но по поводу приоритетов :
[quote]
тогда выполняю роль дебаггера :
int i=1;
i=i+++i разбивается на следущие этапы:
i++ - результат =1, i после этой операции =2
далее
1+2
и того
"value of i will be" 3.
[/quote]
насколько я понимаю, вначале вычисляеться
1+1, затем после выражения инкремент i: 2+1;
здесь это не имеет значения, но в приведённом мной примере a+++i твой порядок вычислений приведёт к неверному результату :
a++ - результат = 12, после этой операции 13
далее
13 + 2
и того
"value of i will be" 15, откомпилированная программа выдаст другой результат
-
[quote=Hunter_83]Подскажите пожалуйста где можно достать исходник IDEA на VSC++? Если у кого-нибудь есть сбросьте плиз на ящик.[/quote]
мне тоже интересно, где сожно скачать исходники IDEA, которая продаеть по 400$ :)(если имелось ввиду IntelliJ IDEA)
[QUOTE]
Интересная ситуация, и дело здесь не только в приоритете, но и в разбивке при лексическом анализе. Честно говоря, я только смутно что-то помнил об этом, и засомневался в решении Piligrim. Этот пример заставил меня скачать стандарт iso c++
[/QUOTE]
ну так я стандарт iso c++ не курил, а всего лишь Страуструпа.. :(
Теперь буду знать [I]правильный[/I] ответ на такой вопрос.
Ull9 жги дальше
-
Ребята, вы оба неправильно ответили на этот вопрос, вы оба срезались.
итак смотрим
i=i+++i,
вы правильно разболи это на
(i++) + i,
но дальше вы допускаете оба ошибку
в соответствии с (великим, святым) стандартом языка с++.компилятор свободен в порядке вычесления левого аргумента и правого аргумента. Т.е он сначала может выполнить i++, затем i, затем сложить оба значения. А может поступить наоборот
сначала i, затем i++, затем сложить. резуьтат будет разный.
правильный ответ звучит так. эта операция даст неопределенный результат.
может 2 может 3.
все, срезались :-) учите стандарт.
-
Ull9, Если бы я был у тебя на собеседовании, то тебе пришлось ответить на один маленький вопрос. Раз ты говоришь, что стандарт позволяет двоякое толкования выражения, то в топку стандарт. (извините за такое слово). Хотя я не знаю ни одного компилятора, который бы выполнял стандарт.
Поэтому, нужно говорить так: так как стандарт допускает разное толкование, но компиляторы (точнее их создатели) вольны выбирать одно с решений. (Компилятор, который дает при каждой компиляции разный результат нам не нужен.) Поэтому говорим так. Компилятор от MS (VS2005) даст результат 3. Тоже запоет нам и Борландовский (BDS2006).
Это навело меня на одну мысль. Я вспомнил книгу Страуструпа, где было сказано, что если есть неоднозначность трактовки, то применяется правило "слева направо". Тогда все стает на свои места. Жаль я сейчас не могу проверить другие компиляторы, но при первой возможности сделаю. Хочеться попробывать скомпилить под FreeBSD (gcc).
раз так хорошо знаеш стандарты и поведение компиляторов, расскажи о результате следующего выражения
int i=1;
int j=10;
int q=i+++++j;
-
[QUOTE=Ull9]вот еще ситуация когда он не будет работать
int j,i=1;
j=MAX(i,++i);
а на первый мой вопрос можешь ответить?
[/QUOTE]
странно, что ты можешь ответить на первый вопрос, но приводишь тут пример, который не будет работать по той же самой причине, даже если MAX будет функцией
-
[QUOTE=KoVadim]расскажи о результате следующего выражения
int i=1;
int j=10;
int q=i+++++j;[/QUOTE]
если тебя интересует разбивка на лексемы, то таким же, как и i ++ ++ + j
а если интересно, почему это не соберется, то потому, что постфиксный инкремент получает lvalue, а возвращает rvalue
-
момент, пока я ездил в универмаг вы тут наворочали, давайте попорядку.
[QUOTE=KoVadim]Ull9, Если бы я был у тебя на собеседовании, то тебе пришлось ответить на один маленький вопрос. Раз ты говоришь, что стандарт позволяет двоякое толкования выражения, то в топку стандарт. (извините за такое слово).;[/QUOTE]
я не говорил что стандарт позволяет двоякое толкование, я говорил что стандарт оставляет на усмотрение компилятора, что выполнить первым.
как компилятор захочет, исходя из своих соображений, так он и поступит.программист, должен это знать и писать код так, чтоб у компилятора небыло возможности создать неправильный результат.
например
int i = 1;
int j = i++;
i=i+j;
при таком коде компилятор даст всегда однозначный результат.
[QUOTE=KoVadim] Хотя я не знаю ни одного компилятора, который бы выполнял стандарт.[/QUOTE]
Полностью стандарт выполняет кажется цомпилятор фирмы комо. Что касается нашего случая, то многие компиляторы это делают. например
VS7, gcc. HP aCC.
[QUOTE=KoVadim]
Поэтому, нужно говорить так: так как стандарт допускает разное толкование, но компиляторы (точнее их создатели) вольны выбирать одно с решений. (Компилятор, который дает при каждой компиляции разный результат нам не нужен.);[/QUOTE]
не так! есть одна тонкость. Стандарт оставляет свободу компилятору в принятии решения. Авторы компилятора такую свободу дают ему.
это означает, что при одних обстоятельствах (контексте) при выражении
int i = foo() + boo();
сначала выполнится foo() потом boo();
при другом контексте эта же самая строка, развернется компилятором подругому. компилятор ради оптимизации свободен как ему это делать.
[QUOTE=KoVadim]У Поэтому говорим так. Компилятор от MS (VS2005) даст результат 3. Тоже запоет нам и Борландовский (BDS2006).
[/QUOTE]
Ты не можешь этого знать, в твоем коде ты создал такой контекст, что компилятор сгенерил код так, нельзя исключать что в другом контексте тот же самый компилятор, возможно несколько строк ниже не сгенерит обратное. еще раз, нужно писать так чтоб компилятор всегда давал один и тот же результат. и ТОЧKА. хватит об этом
-
[QUOTE=pal]странно, что ты можешь ответить на первый вопрос, но приводишь тут пример, который не будет работать по той же самой причине, даже если MAX будет функцией[/QUOTE]
не понял твоей реплики
-
это ты пробелы передвинул
-
[QUOTE=Ull9]не понял твоей реплики[/QUOTE]
моя реплика стостояла в том, что если MAX является функцией и не страдает от double evaluation, результат MAX(i,++i) все равно неопределен, потому что аргументы можно вычислить в любом порядке
-
да верно
ну можно сказать так
int i=1,j=2;
MAX (i++,j);
здесь уже ошибка. и ошибка именно связаная с природой макроса.
и кстати МАХ не функция, если уж на то пошло.
-
вот я и удивлялся, зачем в качестве примера недостатков макросов по сравнению с функциями приводить пример, неработающий и с функциями тоже
-
[QUOTE=pal]вот я и удивлялся, зачем в качестве примера недостатков макросов по сравнению с функциями приводить пример, неработающий и с функциями тоже[/QUOTE]
ну а скажи если изменить пример как я до этого показал,
теперь вопрос.
какие ты видишь проблемы с макросом?