#c #pointers #null
#c #указатели #null
Вопрос:
if ((*l).proc == NULL)
{
(*l).proc = current_process;
if(current_process == NULL)
{
__no_operation();
}
if((*l).proc == NULL)
{
__no_operation();
}
}
При запуске этого кода я добавил точки останова при обоих сбоях. Однако оно прерывается только на втором из двух. Как это возможно?
Комментарии:
1. Мог ли компилятор оптимизировать отсутствие операций?
2. Просто используется стиль, но почему бы вам этого не сделать?
if (!l->proc)
вместоif ((*l).proc == NULL)
3. Другое дело, что такое current_process и l-> proc? Это указатели? Целые числа? Структуры?
4. Я выполнял -> operator раньше, но я попробовал (* l).proc просто чтобы посмотреть, не затевается ли сумасшествие. current_process и l-> proc являются структурами.
Ответ №1:
Любой здравомыслящий компилятор оптимизировал бы эти два идентичных блока в один блок. Вероятно, это также оптимизирует два условных выражения в одно. Если вы хотите, чтобы оба указателя выполнялись отдельно, добавьте puts("A");
к первому и puts("B");
ко второму.
Комментарии:
1. Я изменил это так, чтобы if(current_process == NULL) находился вне основного оператора if (и, следовательно, выполнялся первым делом), что должно избежать оптимизации компилятора (я думаю). Оно по-прежнему прерывается только при втором отключении.