加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 序列点\u0026\u0026运算符

发布时间:2020-12-16 10:34:05 所属栏目:百科 来源:网络整理
导读:对于C 03,标准说,在和左右操作数之间.运算符有一个序列点,因此在访问右运算符之前,左运算符的所有副作用都已发生. 所以 int i = 0;if (++i i--) std::cout i; 定义明确,保证输出0. 但是这个问题是什么:只有左操作数不为0时才评估右操作数?它似乎是一个细节
对于C 03,标准说,在&&和左右操作数之间.运算符有一个序列点,因此在访问右运算符之前,左运算符的所有副作用都已发生.

所以

int i = 0;
if (++i && i--)
    std::cout << i;

定义明确,保证输出0.

但是这个问题是什么:只有左操作数不为0时才评估右操作数?它似乎是一个细节,但对我来说,标准只保证操作数之间的序列点,而不是右操作数永远不会依赖于左操作数进行评估/访问.

例如.

int arr[10];
int pos; // somehow set to a value from 0 to 10
while (pos < 10 && arr[pos] != 0)
    pos++;

这个定义得很好吗? pos可以从10开始或到达10.左操作数没有副作用,与右操作数一致.我是否保证arr [10]!= 0从未执行过?

编辑:

感谢评论和回答,现在很清楚:

5.14p2: "The result is a bool. If the second expression is evaluated,every value computation and side effect associated with the first expression
is sequenced before every value computation and side effect associated with
the second expression."

是序列点的含义.

5.14p1: "Unlike &,&& guarantees left-to-right evaluation: the second operand is
not evaluated if the first operand is false."

是短路的意思.

没有第二个的第一个将使我的例子未定义.谢谢.

解决方法

C 11的5.14p1,最后一句:

Unlike &,&& guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.

所以是的,它是有保证的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读