为什么发布版本中的断言(0)不是未定义的行为?

l4m*_*4m2 0 c undefined-behavior

.assert(x)应该表示x为真,因此编译器应该有权使用此信息进行优化.

例如,

char const* week(int n) {
    assert (n>=0 && n<7);
    switch (n) {
        case 0: return "Sunday";
        ...
        case 6: return "Saturday";
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

可以优化成

char const* week(int n) {
    char const* const* const x = {"Sunday", ..., "Saturday"};
    return x[n];
}
Run Code Online (Sandbox Code Playgroud)

并删除CMP n,7

cor*_*ump 5

我不是说"发布版本"的意思,但断言是一个宏,它定义如下:

#ifdef NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/
#endif
Run Code Online (Sandbox Code Playgroud)

因此,如果您发布的版本与-DNDEBUG混淆,它什么都没有,为什么它应该是未定义的行为?