C 数据类型声明查询



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

int a;
a = 4,3;

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

a = (4,3);

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

这是什么原因呢?

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

作为运算符,逗号首先计算其左侧操作数,然后计算其右侧操作数。 整体表达式的值是第二个结果。 这在某种程度上是对 &&|| 运算符的补充,两者都首先计算其左操作数,但每个操作数仅根据左侧结果有条件地计算其右操作数。

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

赋值运算符的优先级

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

a = 4,3;

。相当于...

(a = 4), 3;

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

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

a = (4, 3);

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

是的

。这将是正确的操作。

   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++编程语言中,逗号运算符(由标记表示(是一个二进制运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型(。

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

此外,逗号运算符的优先级和计算顺序最少

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

int a;
a = 4,3;

分配首先发生,导致a = 4

而且众所周知,()覆盖了precedence,因此我们在以下情况下a = 3

int a = (4,3);

现在我们都明白了,=的理论,让我们集中精力什么时候用,逗号运算符应谨慎使用,最合适的用途是用于彼此密切相关的构造。例如在for loop

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

只要有可能,我将(),结合使用

相关内容

  • 没有找到相关文章

最新更新