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