短路 if 语句

Posted

技术标签:

【中文标题】短路 if 语句【英文标题】:Short circuiting if statement 【发布时间】:2021-08-20 23:23:08 【问题描述】:

假设你有这个嵌套的 if 语句:

int *x;
int y;
if (x == NULL || y > 5)

  if (x != NULL)
    // this should print if x != NULL and y > 5
    printf("Hello!\n");
// this should only print if x == NULL.
printf("Goodbye!\n");

return 0;

这里,如果任一语句为真,它将返回相同的值 (0)。如果外部 if 语句的左侧为真,我们应该只打印“再见”,而不管右侧是真还是假。是否可以通过短路来消除内部 if 语句,将其变成单个 if 语句?

【问题讨论】:

在这种特定情况下,短路行为不会改变任何东西。你的问题不清楚。 代码中的cmets暗示在第二个printf()之前应该有一个else @EugeneSh。我会编辑我的问题。我很好奇是否可以通过短路来消除内部 if 语句。 @user12787203 您应该以清晰易懂的方式编写代码,并将优化留给编译器。 通过“短路”你可以完全消除ifs:(x==NULL && printf("Goodbye!\n")) || (y > 5 && printf("Hello!\n"));。并不是说我鼓励这种风格。 【参考方案1】:

如果我理解正确,您需要的是以下内容

if ( x == NULL )

    printf("Goodbye!\n");

else if ( y > 5 )

    printf("Hello!\n");

否则,如果第一个复合语句包含在 x == NULL 或 y > 5 时必须执行的其他语句,则 if 语句可能看起来像

if ( x == NULL || y > 5)

    // common statements that have to be executed when x == NULL or y > 5
    //...
    if ( !x )
     
        printf("Goodbye!\n");
    
    else
    
        printf("Hello!\n");
    

【讨论】:

【参考方案2】:

这只会在 x 为 NULL 且 y > 5 时打印 Goodbye

if (x == NULL || y > 5)

  if (x != NULL)
    // this should print if x != NULL and y > 5
    printf("Hello!\n");
  else
    // this should only print if x == NULL.
    printf("Goodbye!\n");

【讨论】:

以上是关于短路 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

if语句中的Javascript短路

SQL Server 是不是会短路 IF 语句?

C# 是不是使用 await 对 if 语句执行短路评估?

使用 && 的短路作为 if 语句?

js短路语句

循环语句