C数据类型声明查询

时间:2016-02-08 18:17:47

标签: c comma

在C编程语言中,将4,3分配给整数类型变量,如:

int a;

a = 4,3;

变量接收逗号左边的值(即a在示例中设置为4)。但是,在分配带括号的列表时,例如

a = (4,3);

,变量采用逗号分隔列表中的最后一个值(示例中为3)。

这是什么原因?

3 个答案:

答案 0 :(得分:3)

C以两种不同的方式使用逗号(,):作为复合构造中的元素分隔符,例如数组文字或声明列表,以及作为二元运算符。它没有基于列表的分配,例如某些高级语言。

作为运算符,逗号首先计算其左侧操作数,然后计算其右侧操作数。整个表达式的值是第二个结果。这在某种程度上是对&&||运算符的补充,这两个运算符首先评估它们的左侧操作数,但每个运算符仅有条件地评估其右侧操作数,具体取决于左侧 - 手的结果。

理解观察结果的另一个关键是等号(=也是运算符。它以未指定的顺序计算两个操作数,其结果与右侧操作数相同。修改左侧操作数的值是副作用。

赋值运算符的优先级非常低,但逗号运算符的优先级最低。因此,如果您不使用括号来改变评估顺序,那么......

a = 4,3;

......等同于......

(a = 4), 3;

。它首先评估赋值,产生值4,副作用是将该值赋给变量a。然后它丢弃该值并评估3,得到值3作为整体结果。由于整个事物不是任何更大表达式的一部分,因此结果被丢弃。

另一方面,您可以通过合理使用括号来覆盖优先级,如下所示:

a = (4, 3);

。在这种情况下,首先计算逗号运算符,得到3作为结果,这是赋值运算符的右侧操作数。赋值表达式产生结果3,副作用是将该值赋给变量a

答案 1 :(得分:1)

是的。那将是正确的操作。

   i = (a, b);             // stores b into i 
                          // ... a=1, b=2, c=3, i=2
   i = a, b;               // stores a into i. Equivalent to (i = a), b;
                          // ... a=1, b=2, c=3, i=1

检查逗号运算符的属性。 “在C和C ++编程语言中,逗号运算符(由标记表示)是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。” - 维基百科

答案 2 :(得分:0)

C/C++中,逗号(,)运算符从左到右进行求值,并且左表达式的值将被丢弃。结果的类型和值是右操作数的类型和值。在开始评估右操作数之前,左操作数评估的所有副作用都已完成。取自KR书A.7.18

此外,逗号运算符具有最低优先级和评估顺序

由于=运算符的优先级高于, 运算符。在以下声明中

int a;
a = 4,3;

分配首先导致a = 4

并且众所周知,()会覆盖precedence,因此如果<{p>},我们会a = 3

int a = (4,3);

现在,我们都理解,=的理论,让我们集中讨论何时使用,应谨慎使用逗号运算符,最适合用于彼此强烈相关的构造。,例如for loop

for (i = 0, j = strlen(s)-1; i < j; i++, j--)

只要有可能,我会将(),

结合使用