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

Pet*_*ter 2 c comma-operator

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

data = POC_P_Status, TE_OK;
Run Code Online (Sandbox Code Playgroud)

我不明白这是什么意思.

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

更新:

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

如果我写那个:

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

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

你什么意思?

Pra*_*dit 7

它存储POC_P_Statusdata.

i = a, b;   // stores a into i.
Run Code Online (Sandbox Code Playgroud)

这相当于

(i = a), b;
Run Code Online (Sandbox Code Playgroud)

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

  • @dotixx逗号运算符将两个表达式作为操作数.`return something`不是表达式,所以`return(a,b);`是唯一可能解析它的方法. (2认同)

Ilm*_*uro 5

它等同于以下代码:

data = POC_P_Status;
TE_OK;
Run Code Online (Sandbox Code Playgroud)

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

data = POC_P_Status;
if (TE_OK) { ... }
Run Code Online (Sandbox Code Playgroud)

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

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

这意味着在表达式中:

a, b
Run Code Online (Sandbox Code Playgroud)

a评估并扔掉,然后b进行评估.整个表达式的值等于b:

(a, b) == b
Run Code Online (Sandbox Code Playgroud)

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

for (int i=0, z=length; i < z; i++, z--) {
    // do things
}
Run Code Online (Sandbox Code Playgroud)

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

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

int a, b;
     ^
     |
     Not a comma operator
Run Code Online (Sandbox Code Playgroud)

  • 虽然这一切都是正确的,但它实际上并没有回答"什么是`x = y,z`做什么?"的问题. (2认同)