c-逻辑OR:第二个操作数未求值(6.5.14.4),但编译器生成警告:违反标准



ISO/IEC 9899:202x(E(工作草案-2020年2月5日C17.C2x N2479:

6.5.14逻辑OR运算符:

  1. 如果第一个操作数比较不等于0,则不计算第二个操作数

Context:有一个C编译器,它为涉及逻辑运算符的表达式生成警告condition is always true / false。例如,如果表达式a || b中的变量bunequal to 0,则编译器生成condition is always true(提及b在源代码中的位置(。

问题:生成此类警告的事实是否可以被解释为违反6.5.14.4?请提供解释/论证/参考资料。

注意:gcc / clang / cl(配置有最高警告级别(不会为上述示例生成任何警告。

UPD。MRE:

int main(void)
{
int c1 = 1, c2 = 1, r = 0;
if ( c1 || c2 ) { r = 1; }
return r;
}
$ cc x.c
x.c:4:10: warning: condition is always true
x.c:4:16: warning: condition is always true

虽然有人可能会争辩说,编译器知道||第二个操作数的值的唯一方法是对其进行求值,这违反了C 2018 6.5.14 4中对求值的禁止("…如果||的第一个操作数比较不等于0,则不计算第二个操作数"(,可以理解的是,"评估"是指在程序执行过程中进行的评估,而不是翻译。C 2018 5.1中描述的C概念模型将翻译和执行分开。6.5.14.4禁止在程序执行期间进行评估,而不是在翻译期间。

相关内容

  • 没有找到相关文章

最新更新