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
我不是说"发布版本"的意思,但断言是一个宏,它定义如下:
#ifdef NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/
#endif
Run Code Online (Sandbox Code Playgroud)
因此,如果您发布的版本与-DNDEBUG混淆,它什么都没有,为什么它应该是未定义的行为?
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |