d非常奇怪的case

原文
:如果可在静每一中放case,就应该可放else if.

这不是"对普通模式不适合",而是"非常奇怪".case语句工作方式更像是goto标签,而不是语句.如,以下有效代码:

import std.stdio;
void switchtest(int i, bool b)
{
    switch (i)
    {
        case 1:
            if (b)
            {
                case 2:
                    writefln!"是1b还是2: %s, %s"(i, b);
                    return;
            }
            break;
        default: break;
    }
    assert(false);
}

void main()
{
    switchtest(1, true);
    switchtest(2, false);
}

解释下:
if/else的语法树是:

if (EXPRESSION) STATEMENT [else STATEMENT]

static foreach不匹配else,所以不解析.
switch/case的语法树不是你想的:

switch (EXPRESSION) { [case EXPRESSION: STATEMENT*]* }.

而是:

switch (EXPRESSION) STATEMENT
STATEMENT = ... | CASE_STATEMENT
CASE_STATEMENT = case EXPRESSION:

而是在语义阶段,而非语法阶段,验证CASE_STATEMENT出现在switch中,而没有其它位置限制.
这是static foreach工作的唯一原因.

posted @   zjh6  阅读(15)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示