为了账号安全,请及时绑定邮箱和手机立即绑定

短路评估和副作用

/ 猿问

短路评估和副作用

C
慕码人2483693 2019-11-20 10:19:50

好吧,我有点尴尬地问这个问题,但我只是想确定一下...


众所周知,C在布尔表达式中使用短路评估:


int c = 0;

if (c && func(c)) { /* whatever... */ }

在该示例func(c)中未调用,因为c计算结果为0。但是,在比较复杂的例子中,比较的副作用会改变接下来要比较的变量吗?像这样:


int c; /* this is not even initialized... */

if (canInitWithSomeValue(&c) && c == SOMETHING) { /*...*/ }

函数canInitWithSomeValue返回true并在成功的情况下更改给定指针的值。是否保证后续比较(c == SOMETHING在此示例中)使用设置的值canInitWithSomeValue(&c)?


编译器使用了多么繁重的优化?


查看完整描述

3 回答

?
不负相思意

是否保证后续比较(在本例中为c == SOMETHING)使用canInitWithSomeValue(&c)设置的值?


是。因为有一个序列点


在对&&(逻辑AND),||(逻辑OR)和逗号运算符的左右操作数求值之间。例如,在表达式中*p++ != 0 && *q++ != 0,子表达式* p ++!= 0的所有副作用都在尝试访问q之前完成。


顺序点定义了计算机程序执行中可以保证执行先前评估的所有副作用且尚未执行来自后续评估的副作用的任何点。


查看完整回答
反对 回复 2019-11-20
?
ABOUTYOU

是。因为&&||运算符也都称为序列点。后者定义了何时应该完成上一个操作的副作用,而下一个副作用应该何时开始。


查看完整回答
反对 回复 2019-11-20
?
慕尼黑的夜晚无繁华

if语句复合条件内的评估严格从左至右。如果要优化第二个测试的唯一情况是,编译器是否可以100%地确定第一个测试等于false。


查看完整回答
反对 回复 2019-11-20

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信