【问题标题】:assignment operators and c赋值运算符和 c
【发布时间】:2021-08-10 01:40:39
【问题描述】:
#include <stdio.h>

int main()
{
   int i,j;
   i=j=(22,23,24);
   printf("i:%d",i);
   printf("\nj:%d",j);
}

这将 i,j 的输出都设为 24。

#include <stdio.h>

int main()
{
   int i,j;
   i=j=22,23,24;
   printf("i:%d",i);
   printf("\nj:%d",j);
}

这使得 i,j 都为 22。 有人可以解释背后的术语。 TIA

【问题讨论】:

    标签: c assignment-operator


    【解决方案1】:

    constant 表达式的逗号分隔列表没有多大意义。逗号运算符的主要目的是分隔 赋值 - 一种透明且有意识的副作用。

    使用括号和另外两个作业将其分组为:

    i = j = (22,x=23,y=24);
    

    由于括号(E) 中的表达式是主要表达式,因此可以将其分层视为

    i = j = E; 
    

    这个E 由三个逗号分隔的(子)表达式组成,其中最后一个很重要。这是赋值y=24,结果/评估24

    22被扔掉了,但是x=23有明显的副作用。

    通常E 类似于2*n+1,不需要括号。直到i = j &gt; 22 ? 23 : 24(这里有点混乱)。

    第二组:

    i=j=22, x=23, y=24;
    

    这开始变得有意义了。它只是一行中的三个作业。 23 和 24 没有“丢失”。


    赋值表达式i=j=22本身有一层递归;它从右到左工作,这是很自然的。

    但这些示例更多的是关于组合分隔逗号运算符 , 和分组括号 ( )

    【讨论】:

      【解决方案2】:

      赋值运算符= 的优先级高于逗号运算符,

      C Operator Precedence - cppreference.com

      在此声明中

      i=j=(22,23,24);
      

      首先计算(22,23,24)2223 被逗号运算符忽略,并被评估为 24。然后将结果24赋值给j,值也赋值给i

      另一方面,在此声明中

      i=j=22,23,24;
      

      首先计算i=j=22。这会将22 分配给j,然后将值分配给i。之后,赋值运算符22 的求值结果和整数文字23 被逗号运算符忽略。最后,表达式被计算为值24,它也被忽略了。

      【讨论】:

      • 仅供参考,在其他情况下请注意“该值也分配给i”。在x = y = value 中,value 未分配给y,也分配给xy 接收转换为y 类型的值,然后x 接收 that 转换为x 类型的结果。所以double x; int y; x = y = 3.5; 将 3 分配给 x,而不是 3.5。
      猜你喜欢
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 2021-06-07
      • 2011-11-16
      • 2011-03-11
      • 1970-01-01
      • 2013-06-28
      • 2016-04-01
      相关资源
      最近更新 更多