c - 逻辑或:不计算第二个操作数(6.5.14.4),但编译器生成警告:违反标准?
问题描述
ISO/IEC 9899:202x (E) 工作草案 — 2020 年 2 月 5 日 C17..C2x N2479:
6.5.14 逻辑或运算符:
- 如果第一个操作数比较不等于 0,则不计算第二个操作数。
上下文:有一个 C 编译器,它会condition is always true / false
为涉及逻辑运算符的表达式生成警告。例如,如果表达式中的a || b
变量b
是unequal 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 中禁止评估的规定(“……如果 an 的第一个操作数||
比较不相等为 0,则不计算第二个操作数”)如果第一个操作数比较不等于 0,则可以理解“计算”是指在程序执行期间进行的计算,而不是翻译。C 2018 5.1 中描述的 C 概念模型将翻译和执行分开。6.5.14 4 禁止在程序执行期间进行评估,而不是在翻译期间。
推荐阅读
- python - 在 Pycharm 中,如何逐个单元格移动光标?
- nginx - syslog-ng 未过滤远程服务器上的标签
- java - 如何使用 @BeforeEach 方法在 Java 中进行测试?
- ssl - HAProxy:将客户端 ip(ssl 流量)转发到后端
- gitlab - 可以在 gitlab ci runner 上保存 node_models 吗?
- css - 为 ANTD 扩展或自定义 LESS Mixins
- javascript - 在Angular 8中的表格中格式化数据不起作用
- docusignapi - 不清楚 webhook eventNotification 文档
- swift - Swift-无法对齐具有不同字体大小的堆栈元素
- ios - 从 PWA 向 iOS 发送推送通知