据我所知,这样的代码是目的C.两个赋值在
_conversation.lastMessageSentDate = message.sentDate = [NSDate date];
使用我说得对的假设,该代码同时设置conversation.lastMessageSentDate
和message.sentDate
到NSDate date
?
或者我误解了这行代码?
其他语言有这样的格式吗? 我已经在Python和Java中编程,从来没有见过这样的代码。
谢谢。
据我所知,这样的代码是目的C.两个赋值在
_conversation.lastMessageSentDate = message.sentDate = [NSDate date];
使用我说得对的假设,该代码同时设置conversation.lastMessageSentDate
和message.sentDate
到NSDate date
?
或者我误解了这行代码?
其他语言有这样的格式吗? 我已经在Python和Java中编程,从来没有见过这样的代码。
谢谢。
这些不是两个声明,这是两个赋值语句。你对它的工作方式也绝对正确。
它工作的原因是赋值表达式是生成值的有效表达式。最右边的任务首先被赋值
message.sentDate = [NSDate date]
,然后第二个任务:
_conversation.lastMessageSentDate = /*the result of the first assignment*/
注意它的评价,而不是实际的分配顺序的顺序:这些可以以任何顺序发生,这是因为在没有序列点的情况下不会指定副作用的顺序。
噢好吧。对不起,我试图把这个词写在我的脑海中,我只是忘记了它叫做哈哈。哦,有趣的是,我不知道评估从右边开始。你每天学习新的东西!谢谢 – GangstaGraham 2013-03-06 01:27:41
@GangstaGraham评估只针对一些运营商从右到左。这是一个[表格链接,显示哪些操作符是从左到右,哪些是从右到左](http://en.cppreference.com/w/cpp/language/operator_precedence)。 – dasblinkenlight 2013-03-06 01:30:47
在这个解释中隐含的是,两个变量都指向同一个对象,而不是两个独立的对象,如果每个赋值都在它自己的行上的话。如果该对象是可变的,你需要确定你真的只想要一个对象@GangstaGraham。 – 2013-03-06 01:41:59
多种分配在很多语言中很常见,人们只是比单个分配使用频率低。
红宝石确实有多个任务,比如一些有趣的事情:
name, address1, address2, city, step = record.split(',') # split a CSV record into multiple fields
噢好吧,我已经看过格式化(使用逗号)之前,只是在我猜测之前我从未见过两个等号。谢谢! – GangstaGraham 2013-03-06 01:25:58
这段代码在C语境中是误导性的;只有最后一个变量会分配给它。 – 2013-03-06 01:37:28
的确如此,但他问其他语言是否有这样的约定,因此它回答了问题(它被标记为Ruby)。 – 2013-03-06 01:38:24
如果我看到那行代码,我把它改写成两个不同的任务,只是为了避免我的大脑编制该行的代码' _conversation.lastMessageSentDate = message.sentDate == [NSDate date];' – 2013-03-06 01:30:03