Jos*_*gan 5 c c++ comma operator-precedence operator-keyword
我已经使用SO一段时间作为参考,但之前从未问过问题.我目前正在大学C++课程中阅读Bjarne Stroutstrup 编程:原理和实践,仅仅是为了我自己的利益,因为我在这里看到了一个真正推荐它的问题的答案.
我们现在正在课堂上覆盖操作员,而我似乎无法理解逗号操作符在语句中的工作方式.一个例子是类的在线部分的示例问题,即使我编写C程序并使用GDB获取结果,我仍然会出错.问题是:
假设在下面的表达式之前x == 16,下面的表达式的值是什么(不一定是x的值)?
x ++,++ x,x + = x
我对正确答案不感兴趣,以至于如何得到正确的答案.我已经阅读了类似问题的几个答案,例如这里的问题,但似乎我错过了当实际上没有分配运算符时这是如何适用的.这跟说的一样吗
int y = (x++, ++x, x+=x);
Run Code Online (Sandbox Code Playgroud)
要么
int y = x++, ++x, x+=x;
Run Code Online (Sandbox Code Playgroud)
还是两个?有人可以解释逗号运算符的工作原理,特别是与没有赋值的语句有关吗?
逗号操作符很简单 - 很容易很难.它具有所有运营商的最低优先级; 它的优先级甚至低于赋值运算符.请注意,函数的参数不由逗号运算符分隔.
逗号运算符计算其左侧操作数,生成序列点并丢弃结果,然后计算右侧操作数.
在上下文中:
x++, ++x, x += x;
Run Code Online (Sandbox Code Playgroud)
相当于:
x++;
++x;
x += x;
Run Code Online (Sandbox Code Playgroud)
除了整体价值是结果x += x;.
假设x从16开始,它增加到17,然后是18,然后加倍到36.因此总值为36.
请注意,由于序列点,它不会违反关于不在序列点之间多次递增相同变量的规则.
使用逗号运算符的唯一原因是,有些上下文中您不能使用单独的语句,但可以使用逗号运算符.例如:
for (i = 0, j = n; i < j; ++i, --j)
Run Code Online (Sandbox Code Playgroud)
您不能使用分号代替这些逗号.
在这个问题中,有两个样本:
int y = (x++, ++x, x+=x);
int y = x++, ++x, x+=x;
Run Code Online (Sandbox Code Playgroud)
第一个是合法的(虽然不必要地扭曲),并初始化y为36(并设置x为36).
第二种是不合法的,不会编译; 逗号不是逗号运算符,应该分隔不同的声明符,但是++x和x += x不是声明符.但是,如果它改为:
y = x++, ++x, x+=x;
Run Code Online (Sandbox Code Playgroud)
那么这是合法的.第一个任期是:
y = x++
Run Code Online (Sandbox Code Playgroud)
分配16到17 y,增量x为17.第二个x增加到18; 第三个词x改为36.
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |