powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Порядок вычисления
25 сообщений из 110, страница 3 из 5
Порядок вычисления
    #38823693
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги. Давайте на не повышать градус эмоций.

Об недостатках алгебры инкрементов писал еще старый пьяница и музыкант
профессор Николай Вирт(ов). Что тут еще добавить.

Лучше давайте формализуем такие формы которые требуют
гарантии эквивалентного преобразования в форму без
использования оных стрёмных операций.

Если разработчик умеет и делает трансформацию
этого кода

Код: plaintext
1.
str1[i++] = str2[i++];



в код без пост-икремента, и преобразование - строго однозначно
то проблемы - нет.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823705
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Копировать из одной строки в другую... на одном и том же указателе... это жестко

Я всегда был противником ссылок. Ровно из-за того, что код становится совершенно не читабельным. Кто в здравом уме, может подумать, что в конструкции вида:

*str1++ = *str2++;

str1 и str2 это даже не просто указатель на одну и ту же строку. А вообще, один и тот же указатель, но пропихнутый в код через ссылку. Взрыв мозга.

Но это проблема не компилятора, это проблема цвета волос. Предлагаю просто запретить программистам быть блондинками, красить волосы в светлые тона, делать меллирование. Естественным блондинкам от рождения, конечно, за счет фирмы придется оплатить черную краску и услуги хорошего салона. Должно помочь. IMHO
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823715
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мартин Фаулер ввёл хороший термин. Код с "душком".
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823720
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonstr1[i++] = str2[i++];
А этот код имеет какой нибудь прикладной смысл? "копирование одной строки в другую через символ. Без проверки, что в строке может быть нечетное кол-во символов"?

Я лично бы написал просто (для тупо копирования):

Код: sql
1.
2.
str1[ i ] = str2[ i ];
i++;



код (копирование через один символ)

Код: sql
1.
2.
3.
str1[ i ] = str2[ i ];
i++;
i++;



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

Смысл лепить все в одну строку - не вижу вообще. Когда все в одной строке, такие выражения значительно сложнее отлаживать IMHO & AFAIK
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823725
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати да. Дебаггер видит это как 1 степ.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823733
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуваки, еще раз говорю - данный код пишется не намеренно, а в результате бага.
Соответственно прикладного смысла в нем нет, и переписать его тоже нельзя - сначала его надо найти.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823737
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЧуваки, еще раз говорю - данный код пишется не намеренно, а в результате бага.
Соответственно прикладного смысла в нем нет, и переписать его тоже нельзя - сначала его надо найти.но если такой стиль узаконить, то найти баг будет ещё сложнее, не?

P.S. Возможно, выходом было бы, действительно, уход от UB, но с варнингом, по возможности. Так будут и овцы целы, и волки сыты, кмк
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823739
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Найти в одной строке кода два инкремента. Далее - по обстановке. Остановить compile/build. Выдать варнинг.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823743
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКоллеги. Давайте на не повышать градус эмоций.

Об недостатках алгебры инкрементов писал еще старый пьяница и музыкант
профессор Николай Вирт(ов). Что тут еще добавить.


Ну и как он кончил ? Плохо он кончил -- паскаль написал.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823745
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМартин Фаулер ввёл хороший термин. Код с "душком".

Но этот код (strcpy) БЕЗ душка.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823754
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmaytonМартин Фаулер ввёл хороший термин. Код с "душком".

Но этот код (strcpy) БЕЗ душка.

Хех... ну ладно. Укусил .
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823822
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, K&R приводят в пример функцию

Код: plaintext
1.
2.
3.
4.
void strcpy(char *s, char *t)
{
    while (*s++ = *t++);
}


K&R p. 104Приращение s и t здесь осуществляется в управляющей части цикла. Значением *t++ является символ, на
который указывает переменная t перед тем, как ее значение будет увеличено; постфиксный оператор ++ не
изменяет указатель t, пока не будет взят символ, на который он указывает. То же в отношении s: сначала
символ запомнится в позиции, на которую указывает старое значение s, и лишь после этого значение
переменной s увеличится. Пересылаемый символ является одновременно и значением, которое
сравнивается с '\0' . В итоге копируются все символы, включая и заключительный символ '\0'.

Предлагаю рассмотреть такой участок кода:
Код: plaintext
1.
2.
3.
4.
5.
char buf[]="abcdefg";
char* s1=buf+3;//"defg";
char* s2=buf;//"abcdefg"
strcpy(s1,s2);//1
strcpy(s2,s1);//2


Понятно что в обоих случаях, мы ничего хорошего не получим. Собственно потому в стандарте, в прототипе функции мы можем видеть restrict-квалификаторы

ISO/IEC 9899:201x7.24.2.3 The strcpy function
Synopsis
1
Код: plaintext
1.
2.
3.
#include <string.h>
char *strcpy(char * restrict s1,
const char * restrict s2);

Description
2 The strcpy function copies the string pointed to by s2 (including the terminating null
character) into the array pointed to by s1. If copying takes place between objects that
overlap, the behavior is undefined.
Returns
3 The strcpy function returns the value of s1.

По коду

Код: plaintext
1.
2.
3.
4.
std::vector<int> v = { 0, 0 };
int i = 0;
v[i++] = i++;
std::cout << v[0] << v[1] << endl;



если бы нам сказали, что не должно быть UB, хоть ты тресни, я подумал ещё немного. Возможно стоит вести себя так-же как в примере выше, и на выходе мы получим 00 (знаю что недавно исключил такой вариант). Вообщем у меня такой вопрос, зачем нужен такой код, какая от него практическая выгода ? Думаю что особой выгоды нет, и мы просто пытаемся решить вопрос о том, что было бы если бы мы вводили закон касаемо такого поведения. У меня нет аргументов ни за, ни против того, что такой закон нужен. Приведите их пожалуйста :)


Basil A. Sidorov Программирование всё больше и больше становится производством кода. На любом производстве есть правила техники безопасности, которые могут мешать и мешают эффективному производству.

Почему вы так считаете ?
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823829
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryBasil A. Sidorov Программирование всё больше и больше становится производством кода. На любом производстве есть правила техники безопасности, которые могут мешать и мешают эффективному производству.

Почему вы так считаете ?
По факту так и есть. Производство. Я каждый день делаю code review десятков а то и сотен строк кода. И если-бы не
механизмы FindBug, Cobertura, JUnit, Mockito я-бы просто потонул. Автоматизация проверки кода гарантирует
хотя-бы отсутствие ляпов и неоднозначностей подобно пост-инкрементам.

По поводу движения двух указателей в strcpy я не имею ничего против. Но при этом я оглядываюсь
на прото-ассемблерную семантику "C". Этот исходник написан в "духе" C и соответствует правильным
трендам.

В Java подобный код я не пропущу. Заверну на доработку.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823833
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, к чему я рассуждал про strcmp то. К тому, что и Илья и Анатолий в данном споре оба правы, потому что один видимо говорил про то что эта функция полностью корректна подразумевая ограничения наложенные на входные параметры, а второй рассмотрел общий случай данного кода :)
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823843
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ Java подобный код я не пропущу. Заверну на доработку.
У меня правила жестче. Я джаву целиком заворачиваю
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823844
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я - либерал.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823976
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyУ меня правила жестче. Я джаву целиком заворачиваю
Почему-то это мне напомнило М.Булгакова "Новый способ распространения книг"

В книжном складе не было ни одного покупателя, и приказчики уныло стояли за прилавками. Звякнул звоночек, и появился гражданин с рыжей бородой веером. Он сказал:

— Драсьте…

— Чем могу служить? — обрадованно спросил его приказчик.

— Нам бы гражданина Лермонтова сочинение,— сказал гражданин, легонько икнув.

— Полное собрание прикажете?

Гражданин подумал и ответил:

— Полное. Пудиков на пятнадцать-двадцать.

У приказчика встали волосы дыбом.

— Помилте, оно и всё-то весит фунтов пять, не более!

— Нам известно,— ответил гражданин,— постоянно его покупаем. Заверните экземплярчиков пятьдесят. Пущай ваши мальчики вынесут, у меня тут ломовик дожидается.

Приказчик брызнул по деревянной лестнице вверх и с самой крайней полки доложил почтительно:

— К сожалению, всего пять экземпляров осталось.

— Экая жалость,— огорчился покупатель.— Ну давайте хучь пять. Тогда, милый человек, соорудите мне ещё «Всемирную историю».

— Сколько экземпляров? — радостно спросил приказчик.

— Да отвесь полсотенки…

— Экземплярчиков?

— Пудиков.

Все приказчики вылезли из книжных нор, и сам заведующий подал покупателю стул. Приказчики забегали по лестницам, как матросы по реям.

— Вася! Полка 15-а. Скидай «Всемирную», всю как есть. Не прикажете ли в переплётах? Папка, тиснённая золотом…

— Не требуется,— ответил покупатель.— Нам переплёты ни к чему. Нам главное, чтоб бумага была скверная.

Приказчики опять ошалели.

— Ежели скверная,— нашёлся наконец один из них,— тогда могу предложить сочинения Пушкина и издание Наркомзема.

— Пушкина не потребуется,— ответил гражданин,— он с картинками, картинки твёрдые. А Наркомзема заверни пудов пять на пробу.

Через некоторое время полки опустели, и сам заведующий вежливо выписывал покупателю чек. Мальчики, кряхтя, выносили на улицу книжные пачки. Покупатель заплатил шуршащими белыми червонцами и сказал:

— До приятного свидания.

— Позвольте узнать,— почтительно спросил заведующий,— вы, вероятно, представитель крупного склада?

— Крупного,— ответил с достоинством покупатель,— селёдками торгуем. Наше вам.

И удалился.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824001
Фотография TPAKTOPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раньше делал так, даже на более сложных выражениях - работало. И в C# работало.

Код: plaintext
1.
2.
3.
4.
5.
std::vector<int> v = { 0, 0 };
int i = 0;
v[i] = i++;
v[i] = i++;
std::cout << v[0] << v[1] << endl;



Результат 01

Но уже давно не делаю, потому что если позже сделать copy/paste кода и редактировать, можно по ошибке два раза в строке сделать i++
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824101
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyСоответственно прикладного смысла в нем нет, и переписать его тоже нельзя - сначала его надо найти.Ну, допустим пробьют стену головой - нет, типа, накладных расходов.
Завтра напишут код без инкрементов и получат "изменившееся поведение".
Найти ошибку тоже будет нельзя, т.к. не зная места ошибки невозможно сказать: из-за UB она или из-за незнания хитровывернутых мест стандарта.
Что принципиального меняется в поиске места ошибки? Чем поможет то, что теперь ошибка одинакова на всех системах?
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824183
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevв чем сакральный смысл записи "i,i++" ?Ни в чём. Просто пример, что выёживаться можно по разному.
Можно? Да. Нужно? Нет.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824202
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть, кстати, ещё один, хотя и (пока) абстрактный довод против "доопределения побочных эффектов".
Без побочных эффектов, код вида:
Код: sql
1.
v[i+j] = i - j;

допускает параллельное вычисление, что (потенциально) позволяет компилятору генерить более быстрый код.
Если "доопределять UB", то правила параллельной кодогенерации станут сложнее. Возникнут те самые накладные расходы, которых "раньше не было".

P.S. Пример, разумеется, тупой и, вероятно, без доп.усилий будет обработан суперскалярным конвейером более-менее современных процессоров, но общий посыл от этого не меняется.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824219
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryпропущено...


Почему вы так считаете ?
По факту так и есть. Производство. Я каждый день делаю code review десятков а то и сотен строк кода. И если-бы не
механизмы FindBug, Cobertura, JUnit, Mockito я-бы просто потонул. Автоматизация проверки кода гарантирует
хотя-бы отсутствие ляпов и неоднозначностей подобно пост-инкрементам.

По поводу движения двух указателей в strcpy я не имею ничего против. Но при этом я оглядываюсь
на прото-ассемблерную семантику "C". Этот исходник написан в "духе" C и соответствует правильным
трендам.

В Java подобный код я не пропущу. Заверну на доработку.

в Java поведение подобного кода будет четко определено.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824220
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivв Java поведение подобного кода будет четко определено.И вы можете подтвердить своё высказывание ссылкой на JLS???
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824230
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Test.java
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
package test;

public class Test
{
  public static void main(String[] args)
  {
    int[] ar = {0, 0};
    int i = 0;
    
    ar[i++] = i++;
    System.out.println(i + ": " + ar[0] + ", " + ar[1]);
    
    ar[0] = ar[1] = i = 0;
    ar[++i] = ++i;
    System.out.println(i + ": " + ar[0] + ", " + ar[1]);
    
    ar[0] = ar[1] = i = 0;
    ar[i++] = ++i;
    System.out.println(i + ": " + ar[0] + ", " + ar[1]);
    
    ar[0] = ar[1] = i = 0;
    ar[++i] = i++;
    System.out.println(i + ": " + ar[0] + ", " + ar[1]);
  }
}

Хорошо, когда всего два компилятора и одна платформа:
Код: plaintext
1.
2.
3.
2: 1, 0
2: 0, 2
2: 2, 0
2: 0, 1
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824281
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в тему забористой травы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
package test;

public class Test
{
  public static void main(String[] args)
  {
    int[] ar = {0, 0};
    int i = 0;
    
    ar[++i] = ar[i] = ++i;
    System.out.println(i + ": " + ar[0] + ", " + ar[1]);
  }
}

Код: plaintext
2: 0, 2
Вообще не понимаю результат. Не понимаю, в частности, почему нет ArrayOutOfBoundException ...
Точнее, не понимаю почему при ассоциативности справа-налево, вычисления идут слева-направо.

P.S. Да, не совсем в тему, но всё-таки ...
...
Рейтинг: 0 / 0
25 сообщений из 110, страница 3 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Порядок вычисления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]