C 这个逻辑是如何工作的:k+=(x=5,y=x+2,z=x+y);

C 这个逻辑是如何工作的:k+=(x=5,y=x+2,z=x+y);,c,assignment-operator,comma-operator,C,Assignment Operator,Comma Operator,这个逻辑是如何工作的:k+=x=5,y=x+2,z=x+y 它将如何给出结果k==22。当我初始化k=10的值时 在赋值语句的右侧,从左到右依次使用逗号运算符两次。它的值是最后一个操作数的值。所以这个声明 k+=(x=5,y=x+2,z=x+y); 为了清楚起见,可以将其改写为 k+=( ( x = 5, y = x + 2 ), z = x + y ); 事实上,它相当于下面的一组语句 x = 5; // x is set to 5 y = x + 2; // y is set

这个逻辑是如何工作的:k+=x=5,y=x+2,z=x+y

它将如何给出结果k==22。当我初始化k=10的值时


在赋值语句的右侧,从左到右依次使用逗号运算符两次。它的值是最后一个操作数的值。所以这个声明

k+=(x=5,y=x+2,z=x+y);
为了清楚起见,可以将其改写为

k+=( ( x = 5, y = x + 2 ), z = x + y );
事实上,它相当于下面的一组语句

x = 5;      // x is set to 5
y = x + 2;  // y is set to 7
z = x + y;  // z is set to 12
k += z;     // k is set to 22
来自C标准6.5.17逗号运算符

2逗号运算符的左操作数计算为空 表示在它的评估和那个之间有一个序列点 右操作数的。然后计算右操作数;结果 有它的类型和价值


在赋值语句的右侧,从左到右依次使用逗号运算符两次。它的值是最后一个操作数的值。所以这个声明

k+=(x=5,y=x+2,z=x+y);
为了清楚起见,可以将其改写为

k+=( ( x = 5, y = x + 2 ), z = x + y );
事实上,它相当于下面的一组语句

x = 5;      // x is set to 5
y = x + 2;  // y is set to 7
z = x + y;  // z is set to 12
k += z;     // k is set to 22
来自C标准6.5.17逗号运算符

2逗号运算符的左操作数计算为空 表示在它的评估和那个之间有一个序列点 右操作数的。然后计算右操作数;结果 有它的类型和价值


x=5,y=x+2,z=x+y的值是z,逗号运算符最右边的操作数。z的值为125+5+2,加上k中的首字母10,得到22。只是一个评论:即使我是C方面的专家,如果你问我k+=x=5,y=x+2,z=x+y的表达式是什么;是的,我会说我不知道也不在乎。这个表达是如此的不现实以至于它基本上毫无意义。不仅在真正的代码中没有它的位置,我相信从中学习也是浪费时间。不幸的是,你的导师可能会有不同的感觉,这并不一定是浪费时间。你可能会发现这样的。。。聪明。。。在野外,可能需要或者至少需要以一种更理智的方式重写它,而不影响代码的语义。是的,更好的做法是为代码做什么或应该做什么制定一个规范,但如果做不到这一点,您不一定要以使代码更易于维护的名义来改变行为。@相反,它是一个很好的说明,因此是学习C语言中序列点如何工作的工具。您不喜欢它的事实与此无关。@chepner当然,但是:我们并不是说有经验的程序员在野外调试糟糕的代码。我想,我们谈论的是一个刚开始学习C语言的程序员。我认为,以教育的方式使用这样的代码在道德上等同于教孩子走路,同时在他尝试时用沉重的棍子打他的头。现在,这是真的,士兵或保镖必须能够在被棍子击中时表演,或者更糟。但这并不意味着一个孩子需要这种技能,也不意味着他能很好地利用这种尝试。x=5,y=x+2,z=x+y的值是z,逗号运算符最右边的操作数。z的值为125+5+2,加上k中的首字母10,得到22。只是一个评论:即使我是C方面的专家,如果你问我k+=x=5,y=x+2,z=x+y的表达式是什么;是的,我会说我不知道也不在乎。这个表达是如此的不现实以至于它基本上毫无意义。不仅在真正的代码中没有它的位置,我相信从中学习也是浪费时间。不幸的是,你的导师可能会有不同的感觉,这并不一定是浪费时间。你可能会发现这样的。。。聪明。。。在野外,可能需要或者至少需要以一种更理智的方式重写它,而不影响代码的语义。是的,更好的做法是为代码做什么或应该做什么制定一个规范,但如果做不到这一点,您不一定要以使代码更易于维护的名义来改变行为。@相反,它是一个很好的说明,因此是学习C语言中序列点如何工作的工具。您不喜欢它的事实与此无关。@chepner当然,但是:我们并不是说有经验的程序员在野外调试糟糕的代码。我想,我们谈论的是一个刚开始学习C语言的程序员。我认为,以教育的方式使用这样的代码在道德上等同于教孩子走路,同时在他尝试时用沉重的棍子打他的头。现在,这是真的,士兵或保镖必须能够在被棍子击中时表演,或者更糟。但这并不意味着孩子需要这项技能,也不意味着他们能很好地接受这种尝试。