作业返回的是什么?

Nem*_*emo 35 c

为什么表达式i = 2返回2?这基于什么规则?

printf("%d\n", i = 2 ); /* prints 2 */

在Java/C#中花了很长时间后,我在C域.原谅我的无知.

Oli*_*rth 46

它的评估2因为标准是如何定义它的.从C11标准,第6.5.16节:

赋值表达式具有赋值后左操作数的值

这是允许这样的事情:

a = b = c;
Run Code Online (Sandbox Code Playgroud)

(尽管关于这样的代码是否是好事还是存在争议.)

顺便说一句,这种行为在Java中被复制(我敢打赌它在C#中也是一样的).

  • 由@SurajJain更新到C11的链接.这个构造*也*允许的是(更有用)`if((ptr = func())!= NULL)`... (2认同)

fox*_*337 16

规则是将=转换的右侧操作数返回到赋值给的变量的类型.

int a;
float b;
a = b = 4.5; // 4.5 is a double, it gets converted to float and stored into b 
// this returns a float which is converted to an int and stored in a
// the whole expression returns an int
Run Code Online (Sandbox Code Playgroud)

  • IIRC 这里确实有区别 - `b = 4.5` 在 C 中计算为值 `4.5`,但在 C++ 中它是一个引用 `b` 的左值。一个很难在赋值的 LHS 上实际使用的左值,因为例如 `(a = b) = 1` 无论如何都是 UB,因为在 `a` 的两个修改之间缺少序列点。但我认为在 C++ 中你可以取地址 `&(a = 1)`,它是 `a` 的地址,而在 C 中你不能。如果我错了,有人会纠正我。 (2认同)