Я должен переписать этот сегмент кода, который предполагает вычисление логических выражений при коротком замыкании:
while ((p!=NULL) && (p->val != v)) p=p->next;
такой, что он выполняет точно такую же задачу, не предполагая оценку булевых выражений при коротком замыкании. Кто-нибудь может мне помочь с этим?
Я искал в Интернете, но все, что я получаю, это различия между eval с коротким замыканием и eval без короткого замыкания, но я не могу найти ничего при переписывании одного или другого, чтобы заставить их делать то же самое. Это для экзаменационного обзора (не домашней работы), поэтому было бы здорово помочь кому-нибудь решить его, так что я бы хотя бы знал, как это сделать для простого кода. Пояснения приветствуются 🙂
while(true)
{
if (p == NULL)
break;
if (p->val == v)
break;
p = p->next;
}
Некоторое объяснение: исходный код основан на оценке короткого замыкания. p->val != v
не оценивается, если p!=NULL
оценивается как ложное. Если оно всегда будет оценивать второе выражение, это может привести к нарушению доступа. Если у вас нет короткого замыкания &&
оператор, вы должны убедиться в своем коде, p->val
оценивается только если p!=NULL
,
Вам просто нужно разделить проверку на NULL и доступ к члену p на два оператора.
Оценка короткого замыкания означает, что в условном AND, если первый операнд является ложным, код не проверяет второй, так как он уже знает, что результат является «ложным».
Я бы сказал:
val = null;
while (p != null && val != v)
{
p = p->next();
val = p->val;
}