user-0 提问: 关于赋值表达式a=b的值

回复:
user: user-1
content: 引用 11 楼 junziruyu_ 的回复:恩，那这样说b=c这个表达式得值是多少呢，按照上面那段英语是等于b得值么[/quote] 对的，就等于赋值的结果 ，即b的值

user: user-0
content: 基本算是搞懂了，谢谢大家帮忙

user: user-2
content: 谢谢！学习了……

user: user-0
content: 引用 8 楼 lm_whales 的回复:[quote=引用 4 楼 mymtom 的回复:] a=b=c 就是个赋值表达式呀，就是把 b = c 的值赋给a b = c 本身也是个赋值表达式, 就是把 c 值赋给b,  这个表达式的值就是 c 被赋值后的值。 哪里来的副作用啊？  C89  3.3.16 Assignment operators     An assignment operator stores a value in the object designated by the left operand.  An assignment expression has the value of the left operand after the assignment, but is not an lvalue.  表达式求值求的是表达式的值，求出这个值是表达式的（正）作用。 其他 因为获得这个结果而改变的过程， 例如 b=c 这个表达式 ，b 的值变成和c的值相同，这个作用就是副作用。  虽然赋值的本意，就是使得 b 和 c 的值相同， 但是表达式求值，求得的是整个表达式 b=c 的值，  而子表达式 b的值，是因为求得表达式 b=c 的值，而被改变， 所以，就是 表达式 b=c 的副作用。 所以，副作用的说法是没错的，这和C89的标准并不矛盾  如果 一个语言里赋值语句（表达式） b=c 不是表达式， 或者 这个表达式不需要求一个值来表示它本身。 那么这里面， 给b赋值，就不是副作用了。  C语言 ,每个表达式都有一个值， 而表达式求值，就是求出表达式的值（正作用）  所以很多正常意义的表达式功能， 只能看作表达式求值的副作用。  而很多语言里，本来没有多少意思的，可有可无的， b=c 这个表达式的值，反而成了正作用。   [/quote]恩，那这样说b=c这个表达式得值是多少呢，按照上面那段英语是等于b得值么

user: user-3
content: 引用 8 楼 lm_whales 的回复:例如 b=c 这个表达式 ，b 的值变成和c的值相同，这个作用就是副作用。 晕！ 这个怎么就是副作用了呢？ b=c 的本意就是要把 b 的值变成和c的值相同呀

user: user-4
content: 引用 5 楼 u013163178 的回复:[quote=引用 3 楼 jmy5945hh 的回复:] 之前写过一个程序，诡异地陷入死循环 原来 if (a=1) {    //... }  如果你输出 std::cout << (a=1) << std::endl 会发现这个值是 0 是1吧[/quote]+1

user: user-1
content: 引用 4 楼 mymtom 的回复:a=b=c 就是个赋值表达式呀，就是把 b = c 的值赋给a b = c 本身也是个赋值表达式, 就是把 c 值赋给b,  这个表达式的值就是 c 被赋值后的值。 哪里来的副作用啊？  C89  3.3.16 Assignment operators     An assignment operator stores a value in the object designated by the left operand.  An assignment expression has the value of the left operand after the assignment, but is not an lvalue.  表达式求值求的是表达式的值，求出这个值是表达式的（正）作用。 其他 因为获得这个结果而改变的过程， 例如 b=c 这个表达式 ，b 的值变成和c的值相同，这个作用就是副作用。  虽然赋值的本意，就是使得 b 和 c 的值相同， 但是表达式求值，求得的是整个表达式 b=c 的值，  而子表达式 b的值，是因为求得表达式 b=c 的值，而被改变， 所以，就是 表达式 b=c 的副作用。 所以，副作用的说法是没错的，这和C89的标准并不矛盾  如果 一个语言里赋值语句（表达式） b=c 不是表达式， 或者 这个表达式不需要求一个值来表示它本身。 那么这里面， 给b赋值，就不是副作用了。  C语言 ,每个表达式都有一个值， 而表达式求值，就是求出表达式的值（正作用）  所以很多正常意义的表达式功能， 只能看作表达式求值的副作用。  而很多语言里，本来没有多少意思的，可有可无的， b=c 这个表达式的值，反而成了正作用。

user: user-5
content: 没有一说的那么乱了！就是一个从右向左的赋值而已！ 如果乱的话，分开两条语句写

user: user-6
content: 引用 3 楼 jmy5945hh 的回复:之前写过一个程序，诡异地陷入死循环 原来 if (a=1) {    //... }  如果你输出 std::cout << (a=1) << std::endl 会发现这个值是 0 是1吧

user: user-3
content: a=b=c 就是个赋值表达式呀，就是把 b = c 的值赋给a b = c 本身也是个赋值表达式, 就是把 c 值赋给b,  这个表达式的值就是 c 被赋值后的值。 哪里来的副作用啊？  C89  3.3.16 Assignment operators     An assignment operator stores a value in the object designated by the left operand.  An assignment expression has the value of the left operand after the assignment, but is not an lvalue.

user: user-7
content: 之前写过一个程序，诡异地陷入死循环 原来 if (a=1) {    //... }  如果你输出 std::cout << (a=1) << std::endl 会发现这个值是 0

user: user-8
content: “=”的结合性从右至左。

user: user-8
content: 先说b=c,这是一个赋值表达式，赋值运算符具有副作用，除了有个表达式值外，变量本身值也备改变。具体说，就是b=c的表达式值是c，变量b也被改变了。a=b=c的意思也就一样了，“＝”的结合性从有至左。

user: user-9
content: 引用 3 楼 jmy5945hh 的回复:之前写过一个程序，诡异地陷入死循环 原来 if (a=1) {    //... }  如果你输出 std::cout << (a=1) << std::endl 会发现这个值是 0 乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单，不用格式控制符！ 但是不用格式控制符，输入输出恰好是你期望的格式的时候好说；等到输入输出不是你期望的格式的时候，你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout！ 使用scanf、printf。