逗号运算符如何工作
53619 观看
9回复
5417 作者的声誉
逗号运算符如何在C ++中工作?
例如,如果我这样做:
a = b, c;
结局等于b还是c?
(是的,我知道这很容易测试-只是在此处记录文档,以便别人快速找到答案。)
更新: 使用逗号运算符时,这个问题暴露了细微差别。只是为了证明这一点:
a = b, c; // a is set to the value of b!
a = (b, c); // a is set to the value of c!
这个问题实际上是受代码输入错误的启发。打算是什么
a = b;
c = d;
转换成
a = b, // <- Note comma typo!
c = d;
作者: Joe Schneider
的来源
发布者: 2008 年 9 月 10 日
回应 9
73像
28439 作者的声誉
8像
31279 作者的声誉
126像
417622 作者的声誉
请注意,逗号操作符在C ++中可能会重载。因此,实际行为可能与预期的行为有很大不同。
例如,Boost.Spirit非常巧妙地使用逗号运算符来实现符号表的列表初始化器。因此,它使以下语法成为可能和有意义:
keywords = "and", "or", "not", "xor";
请注意,由于运算符的优先级,该代码(故意!)与
(((keywords = "and"), "or"), "not"), "xor";
也就是说,调用的第一个运算符是keywords.operator =("and")
返回一个代理对象,在该对象上operator,
调用其余的:
keywords.operator =("and").operator ,("or").operator ,("not").operator ,("xor");
作者: Konrad Rudolph
发布者: 2008 年 9 月 10 日
2像
67 作者的声誉
37像
1055 作者的声誉
121像
12286 作者的声誉
在所有C / C ++运算符中,逗号运算符的优先级最低。因此,它始终是绑定到表达式的最后一个,这意味着:
a = b, c;
等效于:
(a = b), c;
另一个有趣的事实是逗号运算符引入了序列点。这意味着表达式:
a+b, c(), d
保证按顺序评估其三个子表达式(a + b,c()和d)。如果它们有副作用,这是很重要的。通常,允许编译器以他们认为合适的任何顺序评估子表达式。例如,在函数调用中:
someFunc(arg1, arg2, arg3)
参数可以按任意顺序求值。注意,函数调用中的逗号不是运算符;它们是分隔符。
作者: efotinis 发布者: 2008 年 9 月 22 日-3像
2516 作者的声誉
首先,首先要注意的是:逗号实际上不是运算符,对于编译器来说,它只是一个令牌,它在上下文中与其他令牌有关联。
这是什么意思,为什么要打扰?
范例1:
为了理解在不同上下文中相同标记的含义之间的区别,我们看一下以下示例:
class Example {
Foo<int, char*> ContentA;
}
通常,C ++初学者会认为此表达式可以/将比较事物,但是它绝对是错误的<
,>
和的含义,
取决于使用的上下文。
上面示例的正确解释当然是模板的实例化。
范例2:
当我们编写具有多个初始化变量和/或一个以上表达式的典型for循环时,在每次循环迭代后都应完成这些操作,我们也使用逗号:
for(a=5,b=0;a<42;a++,b--)
...
逗号的含义取决于使用的上下文,这里是for
构造的上下文。
上下文中的逗号实际上是什么意思?
为了使它更加复杂(与在C ++中一样),逗号运算符本身可以被重载(感谢Konrad Rudolph指出)。
回到问题,《守则》
a = b, c;
对编译器来说意味着
(a = b), c;
因为优先的的=
令牌/操作比的优先级更高的,
令牌。
这是在上下文中解释的
a = b;
c;
(请注意,解释取决于上下文,在这里它既不是函数/方法调用,也不是模板实例化。)
作者: Quonux 发布者: 2013 年 4 月 7 日62像
15559 作者的声誉
逗号运算符:
- 优先级最低
- 是左联想的
为所有类型(内置和自定义)定义了默认版本的逗号运算符,它的工作方式如下-给定exprA , exprB
:
exprA
被评估- 的结果
exprA
被忽略 exprB
被评估- 的结果
exprB
作为整个表达式的结果返回
对于大多数运算符,编译器可以选择执行顺序,并且即使不影响最终结果(甚至false && foo()
将跳过对的调用foo
),甚至甚至需要跳过执行。但是,对于逗号运算符不是这种情况,并且上述步骤将始终发生*。
实际上,默认的逗号运算符的工作方式与分号几乎相同。区别在于,用分号分隔的两个表达式形成两个单独的语句,而逗号分隔将所有表达式保留为单个表达式。这就是为什么在以下情况下有时使用逗号运算符的原因:
- C语法只需要一个表达式,而不是一个语句。例如在
if( HERE )
- C语法只需要一个语句,而不是更多,例如在
for
循环初始化中for ( HERE ; ; )
- 当您想跳过花括号并保留一条语句时:(
if (foo) HERE ;
请不要这样做,这真的很丑!)
如果语句不是表达式,则不能用逗号替换分号。例如,这些是不允许的:
(foo, if (foo) bar)
(if
不是表达式)- int x,int y(变量声明不是表达式)
就您而言,我们有:
a=b, c;
,等于a=b; c;
,假定该a
类型不会使逗号运算符超载。a = b, c = d;
等效于a=b; c=d;
,假设其a
类型不会使逗号运算符超载。
请注意,并非每个逗号实际上都是逗号运算符。一些逗号具有完全不同的含义:
int a, b;
---变量声明列表以逗号分隔,但它们不是逗号运算符int a=5, b=3;
---这也是逗号分隔的变量声明列表foo(x,y)
---用逗号分隔的参数列表。事实上,x
并且y
可以在被评估的任何命令!FOO(x,y)
-逗号分隔的宏参数列表foo<a,b>
---以逗号分隔的模板参数列表int foo(int a, int b)
---逗号分隔的参数列表Foo::Foo() : a(5), b(3) {}
---用逗号分隔的类构造函数中的初始化列表
*如果您应用优化,则并非完全正确。如果编译器认识到某些代码对其余部分完全没有影响,则它将删除不必要的语句。
进一步阅读:http : //en.wikipedia.org/wiki/Comma_operator
作者: CygnusX1 发布者: 2013 年 10 月 5 日2像
197 作者的声誉
是逗号运算符的优先级比赋值运算符低
#include<stdio.h>
int main()
{
int i;
i = (1,2,3);
printf("i:%d\n",i);
return 0;
}
输出:i = 3
因为逗号运算符总是返回最右边的值。
对于带赋值运算符的逗号运算符:
int main()
{
int i;
i = 1,2,3;
printf("i:%d\n",i);
return 0;
}
Ouput:i = 1
我们知道逗号运算符的优先级比赋值的优先级低.....
来自类别的问题 :
- c++ 理解指针有什么障碍,克服它们可以做些什么?
- c++ 在C ++中解析INI文件的最简单方法是什么?
- c++ 什么时候应该在C ++中使用“朋友”?
- c++ 你如何清除stringstream变量?
- c++ 在C ++中,构造函数和析构函数可以是内联函数吗?
- c++ 在C ++中,什么是虚拟基类?
- c++ 什么是C / C ++程序及其插件DLL的最佳免费内存泄漏检测器?
- c++ 如何在C ++(Unicode)中将std :: string转换为LPCWSTR
- c++ 常规投放与static_cast与dynamic_cast
- c++ C ++强制转换语法样式
- comma-operator 逗号运算符做什么?
- comma-operator 逗号运算符如何工作
- comma-operator C逗号运算符的用途
- comma-operator C逗号运算符
- comma-operator 逗号在JavaScript表达式中做了什么?
- comma-operator 逗号运算符何时有用?
- comma-operator What does i = (i, ++i, 1) + 1; do?
- comma-operator 为什么必须用括号括起来的初始化表达式是逗号?
- comma-operator while循环,用逗号运算符来代替重复的代码来代替“ break;”
- comma-operator C-在for循环初始化程序中使用while运算符