You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++20的[[likely]]/[[unlikely]]属性可用于do-while循环条件吗?

结论

你观察到的写法语法合法,但不是该属性作用于do-while循环条件的标准推荐写法。


语法合法的原因

C++标准允许属性说明符序列出现在大多数语句的末尾位置。do-while循环是一个完整的语句,语法定义为:

do 语句 while ( 表达式 ) ;

分号是该语句的结束标记,你在分号后追加[[likely]]属性,属于在完整语句末尾附加属性的合法用法,因此三大主流编译器均不会报语法错误。

功能层面的风险

这种写法的实际优化效果是不可靠的:属性此时是作用于整个do-while语句本身,而非关联到while后的条件分支判断上,编译器可能不会将该属性识别为「循环条件成立是大概率路径」的分支提示。

标准推荐写法

如果要明确将[[likely]]/[[unlikely]]属性作用于do-while的条件分支,标准的放置位置是条件表达式之后、分号之前:

int main(int i, char**)
{
    do {
        ++i;
    } while (i < 42) [[likely]];

    return i;
}

该写法符合C++20标准对分支属性的位置要求,所有支持该属性的编译器都会正确识别分支提示,生成符合预期的优化代码。


内容的提问来源于stack exchange,提问作者invexed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:39:01