Почему C-шники не пишут индекс массива в []?
От: 0K Ниоткуда  
Дата: 09.05.10 20:49
Оценка: -8 :))) :))
Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива? Это ж откуда такая дурная привычка пошла?

Пример (первый попавшийся в Google):

for (i=0;i<copy_this;i++)
   *(to_copy+i)=*(from_copy+i);


Гораздо благороднее выглядит так:

for (i=0;i<copy_this;i++)
   to_copy[i]=from_copy[i];


Причем последнее будет работать в Managed C#, Java и других подобных языках.

А теперь объясните мне в чем смысл этой глупости? По кол-ву символов -- второй меньше аж на 4 символа. Второй нагляднее. По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.
Re: Почему C-шники не пишут индекс массива в []?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 10.05.10 07:15
Оценка: 4 (4) +2
Здравствуйте, 0K, Вы писали:

0K>Пример (первый попавшийся в Google):


0K>
0K>for (i=0;i<copy_this;i++)
0K>   *(to_copy+i)=*(from_copy+i);
0K>


Сишники пишут скорее так:
char *pfrom = from_copy;
char *stop_copy = from_copy + copy_this;
char *pto = to_copy;
for (; pfrom != stop_copy; ++pfrom)
{
    *pto = *pfrom;
    ++pto;
}
Re[2]: Почему C-шники не пишут индекс массива в []?
От: Centaur Россия  
Дата: 11.05.10 07:37
Оценка: +3
Здравствуйте, Nuzhny, Вы писали:
N>Сишники пишут скорее так:
N>char *pfrom = from_copy;
N>char *stop_copy = from_copy + copy_this;
N>char *pto = to_copy;
N>for (; pfrom != stop_copy; ++pfrom)
N>{
N>    *pto = *pfrom;
N>    ++pto;
N>}


Более идиоматично для сишника:
while (pfrom != stop_copy)
    *pfrom++ = *pto++;
Re[3]: Почему C-шники не пишут индекс массива в []?
От: achp  
Дата: 10.05.10 04:41
Оценка: 1 (1) +1
Здравствуйте, Aleх, Вы писали:

A>Оттуда, что по умолчанию в первом случае будет команда add и возможно mul, а во втором lea. Но на самом деле сейчас компиляторы умные и процессоры уже не те, что были раньше. Так что хз как там что быстрее.


Согласно определению языка Си, выражение a[b] абсолютно эквивалентно выражению *(a+b). В Си++ эта эквивалентность для встроенных типов сохраняется.
Re: Почему C-шники не пишут индекс массива в []?
От: LuciferSaratov Россия  
Дата: 09.05.10 21:06
Оценка: +2
Здравствуйте, 0K, Вы писали:

0K>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива?


Это неправда.

0K>По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.


Совершенно одинаково. Можно ещё написать вот так:
for (i=0;i<copy_this;i++)
   i[to_copy]=i[from_copy];
Re: Почему C-шники не пишут индекс массива в []?
От: CreatorCray  
Дата: 10.05.10 08:02
Оценка: +2
Здравствуйте, 0K, Вы писали:

0K>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива?

Тебе попались какие то ацкие извращенцы.
Никто в здравом уме так писать не станет.

0K>А теперь объясните мне в чем смысл этой глупости?

Без понятия. Спроси у авторов первого "шедевра".
Может у них нет на клавиатуре квадратных скобок или по какой то причине они не могут их набрать а триграфы суть ересь богомерзкая и творение диаволово.

По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.
Нет. Они абсолютно одинаковы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re: Почему C-шники не пишут индекс массива в []?
От: 24  
Дата: 09.05.10 21:04
Оценка: 1 (1)
0K>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива? Это ж откуда такая дурная привычка пошла?
Странно, первый раз такое вижу, чтоб форму записи *(a + i) предпочитали a[i].

0K>По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.

По скорости работы они одинаковые, числа надо складывать и там, и там — это одно и то же, только по разному записанное.
Re: Почему C-шники не пишут индекс массива в []?
От: любой  
Дата: 10.05.10 05:31
Оценка: 1 (1)
Здравствуйте, 0K, Вы писали:

...

Так писать имеет смысл, если операторы +, *, [] могут быть перегружены. Или, скажем, операторы + и * реализованы, а [] нет.
художников никогда не обижал
Re: Почему C-шники не пишут индекс массива в []?
От: dilmah США  
Дата: 10.05.10 08:35
Оценка: 1 (1)
0K>не нужно складывать числа.

вообще-то там не только сложение но и умножение на sizeof
Re: Почему C-шники не пишут индекс массива в []?
От: Antikrot  
Дата: 09.05.10 21:03
Оценка: +1
Здравствуйте, 0K, Вы писали:

0K>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива?

не все

0K>Пример (первый попавшийся в Google):

0K>
0K>for (i=0;i<copy_this;i++)
0K>   *(to_copy+i)=*(from_copy+i);
0K>

0K>Гораздо благороднее выглядит так:
0K>
0K>for (i=0;i<copy_this;i++)
0K>   to_copy[i]=from_copy[i];
0K>

0K>А теперь объясните мне в чем смысл этой глупости? По кол-ву символов -- второй меньше аж на 4 символа. Второй нагляднее.
1ый — понты на тему "ща я точно компилятору скажу что делать надо"

0K>По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.

а эта-то глупость откуда тут?
Re: Почему C-шники не пишут индекс массива в []?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 10.05.10 22:27
Оценка: +1
Здравствуйте, 0K, Вы писали:

0K>А теперь объясните мне в чем смысл этой глупости? По кол-ву символов -- второй меньше аж на 4 символа. Второй нагляднее. По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.


Скорее всего, это неверно интеретированное наследие старых компиляторов. Например, вот такой код:

for(char *p = some_str; *p; ++p) { char c = *p; ... }


работал несколько быстрее, чем:

for(int i = 0; i < length_of_some_str; ++i) { char c = s[i]; ... }


Я с этим возился, чтобы не соврать, в 1995 или 1996 году, на, кажется Watcom не то 9, не то 10. Но здесь понятно — дело именно в скорости инкремента указателя против скорости индексных вычислений. Но на кой ляд писать так, как ты процитировал, я в упор не догоняю.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Почему C-шники не пишут индекс массива в []?
От: Pzz Россия https://github.com/alexpevzner
Дата: 10.05.10 23:21
Оценка: :)
Здравствуйте, 0K, Вы писали:

0K>
0K>for (i=0;i<copy_this;i++)
0K>   to_copy[i]=from_copy[i];
0K>


0K>Причем последнее будет работать в Managed C#, Java и других подобных языках.


Дык эта. Специально пишут так, чтобы программисты на C#, Java и т.п. ничего не поняли. Штоб знали свое место

0K>А теперь объясните мне в чем смысл этой глупости? По кол-ву символов -- второй меньше аж на 4 символа. Второй нагляднее. По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.


Одинаково совершенно. Компиляторы давно научились понимать, что в обоих вариантах написано одно и то же, и генерируют одинаковый код.
Re[2]: Почему C-шники не пишут индекс массива в []?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.05.10 15:56
Оценка: :)
Здравствуйте, Antikrot, Вы писали:

A>1ый — понты на тему "ща я точно компилятору скажу что делать надо"


Почему же понты ? когда я писал на С++ это реально работало намного быстрее, сейчас не знаю наверняка.
Re[3]: Почему C-шники не пишут индекс массива в []?
От: 24  
Дата: 11.05.10 18:50
Оценка: :)
Здравствуйте, Bigger, Вы писали:

B>
B>for(i=0; i < copy_this; to_copy[i]=from_copy[i++]);
B>

Так точно писать не надо, т.к. поведение этого кода зависит от компилятора (значение i слева может быть использовано как до инкремента, так и после).
Re[4]: Почему C-шники не пишут индекс массива в []?
От: alsemm Россия  
Дата: 11.05.10 19:50
Оценка: +1
Здравствуйте, 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[7]: Почему C-шники не пишут индекс массива в []?
От: Bigger Российская Империя  
Дата: 14.05.10 07:09
Оценка: :)
Здравствуйте, ambel-vlad, Вы писали:

skip

AV>Не, я действительно был не прав. Можно сказать, облажался. Вот что значит писать в состоянии полного отупения и длительного писания на C#


А ничего так вброс получился

Программист — это шаман..., подарите бубен!
Re[8]: Почему C-шники не пишут индекс массива в []?
От: ambel-vlad Беларусь  
Дата: 14.05.10 07:14
Оценка: :)
Здравствуйте, Bigger, Вы писали:

AV>>Не, я действительно был не прав. Можно сказать, облажался. Вот что значит писать в состоянии полного отупения и длительного писания на C#


B>А ничего так вброс получился

B>

Да ну вас к лешему. Вот так и настигает разочарование в самом себе
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Почему C-шники не пишут индекс массива в []?
От: Aleх  
Дата: 09.05.10 22:42
Оценка:
Здравствуйте, Antikrot, Вы писали:
A>1ый — понты на тему "ща я точно компилятору скажу что делать надо"
Можно ещё добавить, что в первом случае компилятору сложнее будет анализировать код на всякие потенциальные ошибки адресации.

0K>>По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.

A>а эта-то глупость откуда тут?
Оттуда, что по умолчанию в первом случае будет команда add и возможно mul, а во втором lea. Но на самом деле сейчас компиляторы умные и процессоры уже не те, что были раньше. Так что хз как там что быстрее.
Re: Почему C-шники не пишут индекс массива в []?
От: Aleх  
Дата: 09.05.10 22:44
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива? Это ж откуда такая дурная привычка пошла?

Я бы сказал, что это присуще только Сишникам. С++ники пишут нормально.
Re: Почему C-шники не пишут индекс массива в []?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 10.05.10 00:19
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива? Это ж откуда такая дурная привычка пошла?


Возможно, в этом контексте используется более сложная адресная арифметика. Не писать же, например, to_copy[-i] или to_copy[to_copy].
Ce n'est que pour vous dire ce que je vous dis.
Re: Почему C-шники не пишут индекс массива в []?
От: ArtDenis Россия  
Дата: 10.05.10 04:00
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива? Это ж откуда такая дурная привычка пошла?

Это типа тролинг, да? Откуда сведения, что прямо "все как один"?
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Почему C-шники не пишут индекс массива в []?
От: Antikrot  
Дата: 10.05.10 15:41
Оценка:
Здравствуйте, Aleх, Вы писали:

A>Здравствуйте, Antikrot, Вы писали:

A>>1ый — понты на тему "ща я точно компилятору скажу что делать надо"
A>Можно ещё добавить, что в первом случае компилятору сложнее будет анализировать код на всякие потенциальные ошибки адресации.
не совсем понял, это какие ошибки имеются в виду?

0K>>>По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.

A>>а эта-то глупость откуда тут?
A>Оттуда, что по умолчанию в первом случае будет команда add и возможно mul, а во втором lea. Но на самом деле сейчас компиляторы умные и процессоры уже не те, что были раньше.
по умолчанию — это как? можно узнать, зачем там lea вообще? вместо add? а что мешает сложить в mov так же, как в lea? кстати, никто не указывал тип процессора...

A>Так что хз как там что быстрее.

одинаково оно будет. вторая запись почти наверняка во внутреннем представлении компилятора эквивалентна первой.
Re[2]: Почему C-шники не пишут индекс массива в []?
От: Pzz Россия https://github.com/alexpevzner
Дата: 10.05.10 23:22
Оценка:
Здравствуйте, Aleх, Вы писали:

0K>>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива? Это ж откуда такая дурная привычка пошла?

A>Я бы сказал, что это присуще только Сишникам. С++ники пишут нормально.

Это потому, что вы никогда не знаете, перегружены ли у вас квадратные скобки
Re: Почему C-шники не пишут индекс массива в []?
От: Vasvasvas2004  
Дата: 10.05.10 23:33
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива? Это ж откуда такая дурная привычка пошла?


0K>Пример (первый попавшийся в Google):


0K>
0K>for (i=0;i<copy_this;i++)
0K>   *(to_copy+i)=*(from_copy+i);
0K>


0K>Гораздо благороднее выглядит так:


0K>
0K>for (i=0;i<copy_this;i++)
0K>   to_copy[i]=from_copy[i];
0K>


0K>Причем последнее будет работать в Managed C#, Java и других подобных языках.


0K>А теперь объясните мне в чем смысл этой глупости? По кол-ву символов -- второй меньше аж на 4 символа. Второй нагляднее. По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.


По скорости работы ...
— был у меня случай, когда *(to_copy+i)=*(from_copy+i) работал значительно быстрее. С++ gnu compiler (не знаю какой) на Linux делал код для vxWorks 5.*
Re[3]: Почему C-шники не пишут индекс массива в []?
От: TK Лес кывт.рф
Дата: 11.05.10 07:46
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Это потому, что вы никогда не знаете, перегружены ли у вас квадратные скобки


С таким подходом, код надо переписать так:

for (int i=0;i<copy_this;i++)
   i[to_copy]=i[from_copy];


А то, оператор сложения тоже можно перегрузить...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Почему C-шники не пишут индекс массива в []?
От: March_rabbit  
Дата: 11.05.10 14:27
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Aleх, Вы писали:


0K>>>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива? Это ж откуда такая дурная привычка пошла?

A>>Я бы сказал, что это присуще только Сишникам. С++ники пишут нормально.

Pzz>Это потому, что вы никогда не знаете, перегружены ли у вас квадратные скобки

знаем, знаем
не вставляйте в свои проекты чужого Г-кода
или хотя бы проверяйте его перед тем, как....
Re[2]: Почему C-шники не пишут индекс массива в []?
От: Bigger Российская Империя  
Дата: 11.05.10 14:36
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:

LS>Здравствуйте, 0K, Вы писали:


0K>>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива?


LS>Это неправда.


0K>>По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.


LS>Совершенно одинаково. Можно ещё написать вот так:

LS>
LS>for (i=0;i<copy_this;i++)
LS>   i[to_copy]=i[from_copy];
LS>


Тока не бейте, но

for(i=0; i < copy_this; to_copy[i]=from_copy[i++]);

Программист — это шаман..., подарите бубен!
Re: Почему C-шники не пишут индекс массива в []?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.05.10 15:55
Оценка:
Здравствуйте, 0K, Вы писали:

0K>А теперь объясните мне в чем смысл этой глупости? По кол-ву символов -- второй меньше аж на 4 символа. Второй нагляднее. По скорости работы -- насколько я понимаю второй будет быстрее, т.к. не нужно складывать числа.


Вот что случается, когда программированию учат на языках высокого уровня...
Re[2]: Почему C-шники не пишут индекс массива в []?
От: Shellac  
Дата: 11.05.10 18:14
Оценка:
Здравствуйте, Aleх, Вы писали:

A>Здравствуйте, 0K, Вы писали:


0K>>Собственно, в свете последних работ задумался над вопросом: почему С/С++-ники все как один не любят писать индекс элемента массива? Это ж откуда такая дурная привычка пошла?

A>Я бы сказал, что это присуще только Сишникам. С++ники пишут нормально.

с++ники пишут так:


std::copy(from_copy, from_copy + copy_this, to_copy);
Re[4]: Почему C-шники не пишут индекс массива в []?
От: ambel-vlad Беларусь  
Дата: 11.05.10 19:04
Оценка:
Здравствуйте, 24, Вы писали:

B>>
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-шники не пишут индекс массива в []?
От: Antikrot  
Дата: 11.05.10 19:48
Оценка:
Здравствуйте, Ikemefula, Вы писали:

A>>1ый — понты на тему "ща я точно компилятору скажу что делать надо"

I>Почему же понты ? когда я писал на С++ это реально работало намного быстрее, сейчас не знаю наверняка.
сейчас как представил __asm movntdqa, и к чёрту всю эту указательную арифметику
Re[5]: Почему C-шники не пишут индекс массива в []?
От: 24  
Дата: 12.05.10 19:57
Оценка:
On 11.05.2010 22:04, ambel-vlad wrote:
> А разве оно будет разным?
Впринципе если правая часть всегда считается первой, то неоднозначности
таки нет, но тогда слева i будет равно одному при первом присваивании, и
массив будет копироваться со смещением 1. В любом случае, я бы так не
писал, как-то слишком запутанно выглядит.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Почему C-шники не пишут индекс массива в []?
От: Воронков Василий Россия  
Дата: 12.05.10 20:10
Оценка:
Здравствуйте, 24, Вы писали:

B>>
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-шники не пишут индекс массива в []?
От: 24  
Дата: 12.05.10 20:22
Оценка:
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-шники не пишут индекс массива в []?
От: dilmah США  
Дата: 12.05.10 20:27
Оценка:
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-шники не пишут индекс массива в []?
От: Воронков Василий Россия  
Дата: 12.05.10 20:33
Оценка:
Здравствуйте, 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  
Дата: 12.05.10 20:42
Оценка:
24>Да, так и есть, я немного поспешил с ответом и написал ерунду В любом
24>случае я бы так не писал, ибо как-то запутано.
Хотя всё-таки не ерунду написал, может зависеть оно от компилятора, завтра проверю на разных компиляторах ради интереса.
Re[7]: Почему C-шники не пишут индекс массива в []?
От: 24  
Дата: 12.05.10 20:45
Оценка:
ВВ>Внимательно прочитайте эту цитату. Результат постинкремента — значение операнда. *После* операции операнд инкрементится. Выражение справа всегда выполняется до выражения слева.
Но не сказано, что сразу же после инкремента. Вполне может быть, что значение изменится в момент достижения точки следования, которая идёт после использования левой i.
Re[8]: Почему C-шники не пишут индекс массива в []?
От: Воронков Василий Россия  
Дата: 12.05.10 20:53
Оценка:
Здравствуйте, 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-шники не пишут индекс массива в []?
От: 24  
Дата: 12.05.10 21:00
Оценка:
ВВ>Я надеюсь, что ни у кого не вызывает сомнений, что выражение "x = y" выполняется в следующем порядке:

ВВ>1. y

ВВ>2. x
ВВ>3. =

Пока нагуглил, что x[i]=++i — неопределённое поведение, правда без особых пруфлинков, дальше пока гуглить лень. Вопрост такой — в каком порядке, согласно вышеизложенному, будет выполнено
int i = 0;
i = i++;

И какое будет значение i после выполнения этого?
Re[7]: Почему C-шники не пишут индекс массива в []?
От: dilmah США  
Дата: 12.05.10 21:02
Оценка:
ВВ>Выражение справа всегда выполняется до выражения слева.

даже если бы это было верно, это не помогло бы. Но это не верно.
Re[9]: Почему C-шники не пишут индекс массива в []?
От: dilmah США  
Дата: 12.05.10 21:04
Оценка:
ВВ>"Загадочная" фраза из стандарта "between the previous and the next sequence point" под "next sequence point" подразумевает лишь следующее выражение, в котором нам потребуется значение по адресу i. А какое там следующее?

все места, которые считаются sequence points четко описаны. Присваивания среди них нет.
Re[9]: Почему C-шники не пишут индекс массива в []?
От: 24  
Дата: 12.05.10 21:12
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Что значит "сразу после инкремента"?

ВВ>Как пост-инкремент работает:

Результатом следующего кода и вижуал студия и гцц выдаёт 1 2 3 4 0 (поищу ещё компилятор, который даст не это). Т.е. в выражении слева используется значение i до инкремента.

#include <iostream>

int main() {
    int a[5] = {0};
    int b[5] = {1, 2, 3, 4, 5};
    
    for (int i = 0; i < 4; a[i] = b[i++]) {}
    
    for (int i = 0; i < 5; i++) {
        std::cout << a[i] << " ";
    }
    
    return 0;
}
Re[10]: Почему C-шники не пишут индекс массива в []?
От: Воронков Василий Россия  
Дата: 12.05.10 21:18
Оценка:
Здравствуйте, 24, Вы писали:

ВВ>>Что значит "сразу после инкремента"?

ВВ>>Как пост-инкремент работает:
24>Результатом следующего кода и вижуал студия и гцц выдаёт 1 2 3 4 0 (поищу ещё компилятор, который даст не это). Т.е. в выражении слева используется значение i до инкремента.

Скорее всего я действительно путаю. Если для "=" нет sequence point, то результ выражения — это и правда UB.
Re[6]: Почему C-шники не пишут индекс массива в []?
От: ambel-vlad Беларусь  
Дата: 12.05.10 22:23
Оценка:
Здравствуйте, 24, Вы писали:

24>On 11.05.2010 22:04, ambel-vlad wrote:

>> А разве оно будет разным?
24>Впринципе если правая часть всегда считается первой, то неоднозначности
24>таки нет, но тогда слева i будет равно одному при первом присваивании, и
24>массив будет копироваться со смещением 1. В любом случае, я бы так не
24>писал, как-то слишком запутанно выглядит.

Не, я действительно был не прав. Можно сказать, облажался. Вот что значит писать в состоянии полного отупения и длительного писания на C#
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.