Easyelectronics.ru

Электроника для всех
Текущее время: 18 окт 2019, 19:01

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 15:16 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2411
Откуда: Китай, Пекин
только не ржать!

Изображение

кто тут самый умный...давай пиксель, твой выход. срыгни как ты можешь..
вопрос какое будет иметь значение поле test.field

никто не угадает.

откуда я это знаю?... да потому что имею этот ваш С в хвост и в гриву и на разных платформах...

давайте, оправдывайтесь. )

Код:
typedef struct {
   int field;
} bar;

bool foo(bar *b) {
   b->field++;
   return true;
}

int main()
{
   bar b = (bar) { 0 };
   bar test = foo(&b) ? (bar) { b.field } : (bar) { 0 };
}

_________________
unirail.org


Последний раз редактировалось cheblin 27 мар 2019, 16:28, всего редактировалось 6 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 15:22 
Старожил
Аватара пользователя

Зарегистрирован: 23 июл 2010, 09:54
Сообщения: 202
Откуда: Чебоксары
cheblin писал(а):
Код:

bool foo(bar *b) {
   b->field++;
}



А где return?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 15:26 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2411
Откуда: Китай, Пекин
спасибо исправил. тест обрезал, упустил.

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 15:39 
Старожил
Аватара пользователя

Зарегистрирован: 23 июл 2010, 09:54
Сообщения: 202
Откуда: Чебоксары
В результате оптимизации возможно будет "0"

Скорее всего компилятор выкинет функцию вообще, т.е. инкримента не будет. Если оптимизация выключена, то всё пойдёт по плану, на выходе - "1".


Последний раз редактировалось Exeland 27 мар 2019, 15:55, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 15:42 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 652
Откуда: Германия
1


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 15:59 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2411
Откуда: Китай, Пекин
Цитата:
1

ага, тоже так думал и под GCC так и есть.

а теперь внимание на экран.
распоследняя VisualStudio
Изображение

это в процессе отладки. внизу на бряке стОит.

не я понимаю, если в руках ничего кроме кейла не держать то сишечку можно и любить.
но чуть шире... и вот уже она вас любит...

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 16:25 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2284
"«Си» позволяет очень просто выстрелить себе в ногу. На «Си++» сделать это сложнее, но, когда вы это делаете, отрывает всю ногу."
Давайте уже что-то нибудь про Rust и BlackBox, как обычно, если не суждено понять, что такое в стандарте "undefined behaviour".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 16:27 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 652
Откуда: Германия
Из стандарта совершенно четко следует, что будет 1. Про дебаггер стандарт молчит. Что покажет printf?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 16:32 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2411
Откуда: Китай, Пекин
Изображение
мораль?

_________________
unirail.org


Последний раз редактировалось cheblin 27 мар 2019, 16:34, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 16:33 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3297
в умелых руках и хуй - балалайка.

не надо в одной строке с условными операторами использовать изменяющиеся в этой же строке переменные, это вроде как undefined behavior, и зависит от компилятора в какой последовательности он их выполнять будет.

да по стандарту оператор cond ? exp1 : exp2 вычисляет и возвращает exp1 если cond==true,
посмотрите дизассемблер, msvc так и сделал честно вернул b.field, только вот создал он (bar) {b.field}, до того как начал вычислять foo, .
а вот gcc и шланг сначала вычисляют, а потом создают.


Последний раз редактировалось _pv 27 мар 2019, 16:36, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 16:35 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 652
Откуда: Германия
Ну значит прав Эдди - не надо работать на игровой приставке.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 16:37 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 652
Откуда: Германия
SO/IEC 9899:2018, 6.5.15.4:
Цитата:
The first operand is evaluated; there is a sequence point between its evaluation and the evaluation of the second or third operand (whichever is evaluated).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 16:40 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2411
Откуда: Китай, Пекин
спасибо КО.
то ли у меня руки..
то ли стандарт..
то ли шланг...

как вы умудряетесь в одном сообщении несколько противоречивых стэйнтментов сделать?
и с чем собственно спорите?

возьмите этот код и, как и я, прогоните через статические анализаторы. все скажут ОК, молодец, держи пирожок.

_________________
unirail.org


Последний раз редактировалось cheblin 27 мар 2019, 16:42, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 16:41 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3297
dev писал(а):
SO/IEC 9899:2018, 6.5.15.4:
Цитата:
The first operand is evaluated; there is a sequence point between its evaluation and the evaluation of the second or third operand (whichever is evaluated).

ну он адрес ранее созданного (bar) {b.field} посчитал и вернул ПОСЛЕ выполнения foo


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 16:43 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2411
Откуда: Китай, Пекин
_pv, то что произошло в VS и так понятно. только он не адрес взял... а по значению вернул

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 16:46 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 652
Откуда: Германия
_pv писал(а):
ну он адрес ранее созданного (bar) {b.field} посчитал и вернул ПОСЛЕ выполнения foo


Не имеет права. Сначала считается первый операнд со всеми сайд-эффектами, потом второй или третий.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 16:52 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2411
Откуда: Китай, Пекин
Цитата:
не надо в одной строке с

не буду

Изображение

продолжай....

_________________
unirail.org


Последний раз редактировалось cheblin 27 мар 2019, 17:06, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 17:02 
Заглядывает иногда

Зарегистрирован: 16 сен 2018, 10:41
Сообщения: 124
А ничего не поменялось, UB никуда не делось. Кстати, в Паскале точно так же можно выстрелить себе в ногу, поэтому стараюсь так не писать.
А Си всё равно не люблю. За то, что у него как в анекдоте "три ствола и всё небо в попугаях".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 17:04 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 652
Откуда: Германия
Уже третий. Где там UB?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 17:08 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2411
Откуда: Китай, Пекин
Изображение

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 17:09 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3297
dev писал(а):
_pv писал(а):
ну он адрес ранее созданного (bar) {b.field} посчитал и вернул ПОСЛЕ выполнения foo

Не имеет права. Сначала считается первый операнд со всеми сайд-эффектами, потом второй или третий.


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

bar b = (bar) { 0 };
xor eax, eax
mov DWORD PTR _$S1$[ebp], eax
mov ecx, DWORD PTR _$S1$[ebp]
mov DWORD PTR _b$[ebp], ecx

bar test = foo(&b) ? (bar) { b.field } : (bar) { 0 };
mov edx, DWORD PTR _b$[ebp]
mov DWORD PTR _$S2$[ebp], edx //сделали (bar) { b.field } == 0
xor eax, eax
mov DWORD PTR _$S3$[ebp], eax // сделали (bar) { 0 }
lea ecx, DWORD PTR _b$[ebp]
push ecx
call _foo
add esp, 4
test eax, eax
je SHORT $LN3@main
mov edx, DWORD PTR _$S2$[ebp] //вернули (bar) { b.field }
mov DWORD PTR $T1[ebp], edx
jmp SHORT $LN4@main
$LN3@main:
mov eax, DWORD PTR _$S3$[ebp] //вернули (bar) { 0 }
mov DWORD PTR $T1[ebp], eax
$LN4@main:
mov ecx, DWORD PTR $T1[ebp]
mov DWORD PTR _test$[ebp], ecx


просто не надо делать вешей типа a[i++] = i++; чтобы потом не удивляться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 17:12 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2411
Откуда: Китай, Пекин
Цитата:
просто не надо делать

я переписал пример смотри выше. ничего подобного a[i++] = i++ там и рядом нет.

_________________
unirail.org


Последний раз редактировалось cheblin 27 мар 2019, 17:13, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 17:12 
Старожил
Аватара пользователя

Зарегистрирован: 11 мар 2010, 12:44
Сообщения: 1118
Откуда: Default city
Ну не следует VS стандарту, что впервой ли?
И имеет тебя тут не C, а кривая реализация компилятора. Везде, где есть несколько реализаций одного стандарта будет так. Да, это плохо. Нет, это не вина С, а несовершенство мироздания как такового. И, да, системный программист должен быть готов к таким событиям когда пихает в одну единицу трансляции условный оператор и меняющие условия вызовы.

_________________
Не дай Бог увидеть нубский ЛУТ, бессмысленный и беспощадный
В МК "на порядок" - это "в два раза"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 17:14 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2411
Откуда: Китай, Пекин
Цитата:
пихает в одну единицу трансляции

да нет уже такого. смотри последний пример
Цитата:
это не вина С, а

сам по себе язык без компилятора - профанация. а MSVC - это ого-го какой слон. и когда С начинает вести себя как javascript - в зависимости от того под каким браузером его запустили.
при этом имея такую длинную историю за собой - это фиаско - братан

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очередная сишечка...
СообщениеДобавлено: 27 мар 2019, 17:28 
Заглядывает иногда

Зарегистрирован: 16 сен 2018, 10:41
Сообщения: 124
dev писал(а):
Уже третий. Где там UB?
UB там же, где и в классическом "++i + ++i", только хорошо замаскирован. А если речь идёт о то, что
dev писал(а):
Не имеет права. Сначала считается первый операнд со всеми сайд-эффектами, потом второй или третий.
то, по-моему, в этих наслоениях стандартов и оптимизаций уже сам чёрт ногу сломит, поэтому для меня это UB и я и в Паскале стараюсь этого избегать.

cheblin писал(а):
Цитата:
пихает в одну единицу трансляции
да нет уже такого. смотри последний пример

Ага, посмотрел, b++ ? b : 0
Там не только с точки зрения языка странное выражение, но и с точки зрения оптимизатора. Результат дважды непредсказуем.

cheblin писал(а):
когда С начинает вести себя как javascript - в зависимости от того под каким браузером его запустили ... это фиаско - братан
А вот тут полностью согласен.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB