@PSkocik的答案很好,但是我加了两美分。不确定我应该作为评论还是作为回答;选择后者,是因为恕我直言值得其他人看到,而评论则经常是看不见的。
我不仅偶尔使用
if(0) {
//deliberately left empty
} else if( cond1 ) {
//deliberately left empty
} else if( cond2 ) {
//deliberately left empty
...
} else {
// no conditions matched
}
但是我偶尔也会
if( 1
&& cond1
&& cond2
...
&& condN
) {
要么
if( 0
|| cond1
|| cond2
...
|| condN
) {
对于复杂的条件。出于相同的原因-易于编辑,#ifdef等。
为此,我将在Perl中
@array = (
elem1,
elem2,
...
elem1,
) {
- 请注意列表末尾的逗号。我忘记了逗号在C和C ++列表中是分隔符还是分隔符。恕我直言,这是我们了解到的一件事:[ Perl中的逗号结尾是不好的做法吗?逗号]是一件好事。像任何新的符号一样,它需要一段时间才能习惯。
我将if(0)
代码与Lisp 进行了比较
(cond (test1 action1)
(test2 action2)
...
(testn actionn))
您猜对了,我可能会缩进为
(cond
(test1 action1)
(test2 action2)
...
(testn actionn)
)
有时,我试图想象一种更具人类可读性的语法是什么样的。
也许
IF
:: cond1 THEN code1
:: cond2 THEN code2
...
:: condN THEN codeN
FI
受Dikstra的[ https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_if][Guarded Command Language]的启发。
但是这种语法意味着条件是并行评估的,而if...else-if
意味着条件的顺序评估和优先评估。
在编写会生成其他程序的程序时,我开始做这种事情,这特别方便。
在此过程中,当使用英特尔旧的iHDL编写RTL时,我已经编写了类似
IF 0 THEN /*nothing*/
**FORC i FROM 1 TO 10 DOC**
ELSE IF signal%i% THEN
// stuff to do if signal%i% is active
**ENDC**
ELSE
// nothing matched
ENDIF
其中的FORC..DOC..ENDC
是宏预处理器循环构造,扩展为
IF 0 THEN /*nothing*/
ELSE IF signal1 THEN
// stuff to do if signal1 is active
ELSE IF signal2 THEN
// stuff to do if signal2 is active
...
ELSE IF signal100 THEN
// stuff to do if signal100 is active
ELSE
// nothing matched
ENDIF
这是单一分配的非强制性代码,因此,如果您需要执行诸如查找第一个设置位之类的操作,则不允许设置状态变量。
IF 0 THEN /*nothing*/
ELSE IF signal1 THEN
found := 1
ELSE IF signal2 THEN
found := 2
...
ELSE IF signal100 THEN
found := 100
ELSE
// nothing matched
ENDIF
想一想,这可能是我第一次遇到这样的结构。
顺便说一句,某些人对if(0)风格的异议-else-if条件是顺序依赖的并且不能随意重新排序-不适用于RTL中的AND和OR和XOR逻辑-但适用于short-电路&&和||。