好吧,我有点尴尬地问这个问题,但我只是想确定一下...众所周知,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 回答
不负相思意
TA贡献1777条经验 获得超10个赞
是否保证后续比较(在本例中为c == SOMETHING)使用canInitWithSomeValue(&c)设置的值?
是。因为有一个序列点
在对&&(逻辑AND),||(逻辑OR)和逗号运算符的左右操作数求值之间。例如,在表达式中*p++ != 0 && *q++ != 0,子表达式* p ++!= 0的所有副作用都在尝试访问q之前完成。
顺序点定义了计算机程序执行中可以保证执行先前评估的所有副作用且尚未执行来自后续评估的副作用的任何点。
- 3 回答
- 0 关注
- 441 浏览
添加回答
举报
0/150
提交
取消