C中“,”运算符的行为不清楚

时间:2013-07-18 12:58:21

标签: c comma-operator

在给定的代码中,我发现了以下序列,

data = POC_P_Status, TE_OK;

我不明白这是什么意思。

数据元素是否接收第一个或第二个元素或其他内容?

更新

我在某处读到过这样的行为,

如果我写那个:

  

if(data = POC_P_Status,TE_OK){...}

如果TE_OK为真,那么teh if子句将为真。

你是什么意思?

2 个答案:

答案 0 :(得分:7)

POC_P_Status存储到data

i = a, b;   // stores a into i.

这相当于

(i = a), b;

因为逗号运算符的优先级低于赋值。

答案 1 :(得分:5)

它等同于以下代码:

data = POC_P_Status;
TE_OK;

换句话说,它会将POC_P_Status分配给data并评估为TE_OK。 在第一种情况下,表达式是独立的,因此TE_OK只有在具有副作用的宏时才有意义。在第二种情况下,表达式实际上是if语句的一部分,因此它总是计算为TE_OK的值。该声明可以改写为:

data = POC_P_Status;
if (TE_OK) { ... }

从C11草案(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf):

  

逗号运算符的左操作数被评估为void   表达;评估后有一个序列点。那么   右操作数被评估;结果有它的类型和价值。如果   尝试修改逗号运算符的结果或   在下一个序列点之后访问它,行为是未定义的。

这意味着在表达式中:

a, b

评估并抛弃a,然后评估b。整个表达式的值等于b

(a, b) == b

逗号运算符通常用于需要多个赋值但只允许一个表达式的地方,例如for循环:

for (int i=0, z=length; i < z; i++, z--) {
    // do things
}

其他上下文中的逗号(如函数调用和声明)是逗号运算符:

int func(int a, int b) {...}
              ^
              |
              Not a comma operator

int a, b;
     ^
     |
     Not a comma operator