如果If-Statement包含赋值语句,它在C中是否更快?

CRI*_*IMX 0 c c++ programming-languages

我正在阅读lcc的源代码,在alloc.c:

if ((ap->next = freeblocks) != NULL) {
   freeblocks = freeblocks->next;
   ap = ap->next;
}
Run Code Online (Sandbox Code Playgroud)

为什么不

if (freeblocks != NULL) {
   ap->next = freeblocks;
   freeblocks = freeblocks->next;
   ap = ap->next;
}
Run Code Online (Sandbox Code Playgroud)

后者会造成额外费用吗?

dav*_*mac 8

您发布的代码段在功能上不相同.

第一个分配freeblocks给ap->next,如果不是NULL,则继续其他两个陈述.

您提议的第二个,如果是freeblocks 则不分配freeblocks,在这种情况下实际上什么也不做.这不一样.ap->nextNULL

您可以将提案更改为以下内容,这在功能上是等效的:

ap->next = freeblocks;
if (freeblocks != NULL) {
   freeblocks = freeblocks->next;
   ap = ap->next;
}
Run Code Online (Sandbox Code Playgroud)

这避免了一些人认为不好的风格的分配条件.假设您在编译时表示执行速度或代码大小,则不太可能导致任何额外的"成本".

  • @Deduplicator:我认为它很好,因为它*更清楚地捕捉程序员的意图*.请记住,*少量冗余是好的*因为它有助于理解. (2认同)