c – 是否存在else if语句?

前一段时间之后,不再站立如此:
if (arg)
    invk(test);
else if (test)
{
    alot();
    stuff();
}

我决定让自己更好地在1920×1200次的可读性,不要忽略{}.

所以我写了一个重新格式化现有代码的工具.

后来我注意到该工具导致的错误

if (x)
{
 ...
}
else if(y)
{
 ...
}
else if(z)
{
 ...
}

已经改变(wihtout意见改变行为)成:

if (x)
{
 ...
}
else 
{
    if(y)
    {
     ...
    }
    else
    {
        if(z)
        {
         ...
        }
    }
}

这使我意识到(意想不到的),这实际上是一个如果通过语法和语义规则C

那么甚至还有一个if()存在的语句呢,还是只是一种滥用语义,导致这个有用的(但是为了这个目的,我们可以这么称呼它)混淆起源的措辞,打破任何形成的规则,只是作为人类可读的?

解决方法

根据C11章节§6.8.4,选择语句,可用的语句块是
if ( expression ) statement
if ( expression ) statement else statement
switch ( expression ) statement

关于其他部分,

An else is associated with the lexically nearest preceding if that is allowed by the
Syntax.

所以,没有别的,如果构造,按照标准C存在

显然,if(或if … else)块可以作为else块中的语句存在(嵌套if else else,我们可以这么说).

缩进的选择留给用户.

注意:

只是为了添加,没有一个单独的else if构造存在的理由,可以通过嵌套实现功能.见this wiki article.相关报价

The often-encountered else if in the C family of languages,and in COBOL and Haskell,is not a language feature but a set of nested and independent “if then else” statements combined with a particular source code layout. However,this also means that a distinct else-if construct is not really needed in these languages.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...