Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, Aleх, Вы писали:
0K>>>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива? Это ж откуда такая дурная привычка пошла? A>>Я бы сказал, что это присуще только Сишникам. С++ники пишут нормально.
Pzz>Это потому, что вы никогда не знаете, перегружены ли у вас квадратные скобки
знаем, знаем
не вставляйте в свои проекты чужого Г-кода
или хотя бы проверяйте его перед тем, как....
Re[2]: Почему C-шники не пишут индекс массива в []?
Здравствуйте, LuciferSaratov, Вы писали:
LS>Здравствуйте, 0K, Вы писали:
0K>>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива?
LS>Это неправда.
0K>>По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.
LS>Совершенно одинаково. Можно ещё написать вот так: LS>
Здравствуйте, 0K, Вы писали:
0K>А теперь объясните мне в чем смысл этой глупости? По кол-ву символов -- второй меньше аж на 4 символа. Второй нагляднее. По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.
Вот что случается, когда программированию учат на языках высокого уровня...
Re[2]: Почему C-шники не пишут индекс массива в []?
Здравствуйте, Aleх, Вы писали:
A>Здравствуйте, 0K, Вы писали:
0K>>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива? Это ж откуда такая дурная привычка пошла? A>Я бы сказал, что это присуще только Сишникам. С++ники пишут нормально.
B>>for(i=0; i < copy_this; to_copy[i]=from_copy[i++]);
B>>
24>Так точно писать не надо, т.к. поведение этого кода зависит от компилятора (значение i слева может быть использовано как до инкремента, так и после).
А разве оно будет разным?
P.S. Полагаю, что i — это число
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Почему C-шники не пишут индекс массива в []?
Здравствуйте, Ikemefula, Вы писали:
A>>1ый — понты на тему "ща я точно компилятору скажу что делать надо" I>Почему же понты ? когда я писал на С++ это реально работало намного быстрее, сейчас не знаю наверняка.
сейчас как представил __asm movntdqa, и к чёрту всю эту указательную арифметику
Re[4]: Почему C-шники не пишут индекс массива в []?
Здравствуйте, 24, Вы писали:
24>Здравствуйте, Bigger, Вы писали:
B>>
B>>for(i=0; i < copy_this; to_copy[i]=from_copy[i++]);
B>>
24>Так точно писать не надо, т.к. поведение этого кода зависит от компилятора (значение i слева может быть использовано как до инкремента, так и после).
Тогда так:
for(i=0; i < copy_this; to_copy[i]=from_copy[i], ++i);
Re[5]: Почему C-шники не пишут индекс массива в []?
On 11.05.2010 22:04, ambel-vlad wrote: > А разве оно будет разным?
Впринципе если правая часть всегда считается первой, то неоднозначности
таки нет, но тогда слева i будет равно одному при первом присваивании, и
массив будет копироваться со смещением 1. В любом случае, я бы так не
писал, как-то слишком запутанно выглядит.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Почему C-шники не пишут индекс массива в []?
B>>for(i=0; i < copy_this; to_copy[i]=from_copy[i++]);
B>>
24>Так точно писать не надо, т.к. поведение этого кода зависит от компилятора (значение i слева может быть использовано как до инкремента, так и после).
Это поведение не должно зависеть от компилятора. Если, скажем, на момент выполнения to_copy = from_copy значение i = 0, то в правой части выражения будет обращение по индексу 0, а в левой — по индексу 1.
Другого просто не дано.
Re[5]: Почему C-шники не пишут индекс массива в []?
On 12.05.2010 23:10, Воронков Василий wrote: > Это поведение не должно зависеть от компилятора. Если, скажем, на момент > выполнения to_copy = from_copy значение i = 0, то в правой части > выражения будет обращение по индексу 0, а в левой — по индексу 1. > Другого просто не дано.
Да, так и есть, я немного поспешил с ответом и написал ерунду В любом
случае я бы так не писал, ибо как-то запутано.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Почему C-шники не пишут индекс массива в []?
B>>>for(i=0; i < copy_this; to_copy[i]=from_copy[i++]);
ВВ>Это поведение не должно зависеть от компилятора. Если, скажем, на момент выполнения to_copy = from_copy значение i = 0, то в правой части выражения будет обращение по индексу 0, а в левой — по индексу 1. ВВ>Другого просто не дано.
ээээ..
[quote]
The result of the postfix ++ operator is the value of the operand. After the result is
obtained, the value of the operand is incremented.
[/quote]
[quote]
The side effect of updating the stored value of the operand shall occur between
the previous and the next sequence point.
[/quote]
где в стандарте написано, что первый i будет взят до а не после "The side effect of updating the stored value"???
Re[6]: Почему C-шники не пишут индекс массива в []?
Здравствуйте, dilmah, Вы писали:
D>где в стандарте написано, что первый i будет взят до а не после "The side effect of updating the stored value"???
Не понял, вы сами же только что это и процитировали:
The result of the postfix ++ operator is the value of the operand. After the result is
obtained, the value of the operand is incremented.
Внимательно прочитайте эту цитату. Результат постинкремента — значение операнда. *После* операции операнд инкрементится. Выражение справа всегда выполняется до выражения слева.
Re[6]: Почему C-шники не пишут индекс массива в []?
24>Да, так и есть, я немного поспешил с ответом и написал ерунду В любом 24>случае я бы так не писал, ибо как-то запутано.
Хотя всё-таки не ерунду написал, может зависеть оно от компилятора, завтра проверю на разных компиляторах ради интереса.
Re[7]: Почему C-шники не пишут индекс массива в []?
ВВ>Внимательно прочитайте эту цитату. Результат постинкремента — значение операнда. *После* операции операнд инкрементится. Выражение справа всегда выполняется до выражения слева.
Но не сказано, что сразу же после инкремента. Вполне может быть, что значение изменится в момент достижения точки следования, которая идёт после использования левой i.
Re[8]: Почему C-шники не пишут индекс массива в []?
Здравствуйте, 24, Вы писали:
ВВ>>Внимательно прочитайте эту цитату. Результат постинкремента — значение операнда. *После* операции операнд инкрементится. Выражение справа всегда выполняется до выражения слева. 24>Но не сказано, что сразу же после инкремента. Вполне может быть, что значение изменится в момент достижения точки следования, которая идёт после использования левой i.
Что значит "сразу после инкремента"?
Как пост-инкремент работает:
Push i //поднимаем на стек значение по адресу i
Dup //копируем значение на стеке
Incr //будет считать, что тут мы увеличиваем топ стека на 1
Pop i //пишем топ стека по адресу i
Что осталось на трубе? Правильно — первоначальное значение i.
"Загадочная" фраза из стандарта "between the previous and the next sequence point" под "next sequence point" подразумевает лишь следующее выражение, в котором нам потребуется значение по адресу i. А какое там следующее?
Я надеюсь, что ни у кого не вызывает сомнений, что выражение "x = y" выполняется в следующем порядке:
1. y
2. x
3. =
Re[9]: Почему C-шники не пишут индекс массива в []?
ВВ>Я надеюсь, что ни у кого не вызывает сомнений, что выражение "x = y" выполняется в следующем порядке:
ВВ>1. y ВВ>2. x ВВ>3. =
Пока нагуглил, что x[i]=++i — неопределённое поведение, правда без особых пруфлинков, дальше пока гуглить лень. Вопрост такой — в каком порядке, согласно вышеизложенному, будет выполнено
int i = 0;
i = i++;
И какое будет значение i после выполнения этого?
Re[7]: Почему C-шники не пишут индекс массива в []?
ВВ>"Загадочная" фраза из стандарта "between the previous and the next sequence point" под "next sequence point" подразумевает лишь следующее выражение, в котором нам потребуется значение по адресу i. А какое там следующее?
все места, которые считаются sequence points четко описаны. Присваивания среди них нет.