在给定的代码中,我发现以下序列,
data = POC_P_Status, TE_OK;
我不明白那是什么意思。
数据元素是否接收第一个或第二个元素或其他内容?
更新:
我在某处读到这种行为是这样的,
如果我会这样写:
如果(数据 = POC_P_Status,TE_OK){ ... }
如果 TE_OK 为真,则 if 子句为真。
你是什么意思?
在给定的代码中,我发现以下序列,
data = POC_P_Status, TE_OK;
我不明白那是什么意思。
数据元素是否接收第一个或第二个元素或其他内容?
更新:
我在某处读到这种行为是这样的,
如果我会这样写:
如果(数据 = POC_P_Status,TE_OK){ ... }
如果 TE_OK 为真,则 if 子句为真。
你是什么意思?
它存储POC_P_Status
到data
.
i = a, b; // stores a into i.
这相当于
(i = a), b;
因为逗号运算符的优先级低于赋值。
它等效于以下代码:
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