2013-03-06 68 views
4
一号线

据我所知,这样的代码是目的C.两个赋值在

_conversation.lastMessageSentDate = message.sentDate = [NSDate date]; 

使用我说得对的假设,该代码同时设置conversation.lastMessageSentDatemessage.sentDateNSDate date

或者我误解了这行代码?

其他语言有这样的格式吗? 我已经在Python和Java中编程,从来没有见过这样的代码。

谢谢。

+0

如果我看到那行代码,我把它改写成两个不同的任务,只是为了避免我的大脑编制该行的代码' _conversation.lastMessageSentDate = message.sentDate == [NSDate date];' – 2013-03-06 01:30:03

回答

5

这些不是两个声明,这是两个赋值语句。你对它的工作方式也绝对正确。

它工作的原因是赋值表达式是生成值的有效表达式。最右边的任务首先被赋值

message.sentDate = [NSDate date] 

,然后第二个任务:

_conversation.lastMessageSentDate = /*the result of the first assignment*/ 

注意它的评价,而不是实际的分配顺序的顺序:这些可以以任何顺序发生,这是因为在没有序列点的情况下不会指定副作用的顺序。

+0

噢好吧。对不起,我试图把这个词写在我的脑海中,我只是忘记了它叫做哈哈。哦,有趣的是,我不知道评估从右边开始。你每天学习新的东西!谢谢 – GangstaGraham 2013-03-06 01:27:41

+0

@GangstaGraham评估只针对一些运营商从右到左。这是一个[表格链接,显示哪些操作符是从左到右,哪些是从右到左](http://en.cppreference.com/w/cpp/language/operator_precedence)。 – dasblinkenlight 2013-03-06 01:30:47

+1

在这个解释中隐含的是,两个变量都指向同一个对象,而不是两个独立的对象,如果每个赋值都在它自己的行上的话。如果该对象是可变的,你需要确定你真的只想要一个对象@GangstaGraham。 – 2013-03-06 01:41:59

0

多种分配在很多语言中很常见,人们只是比单个分配使用频率低。

红宝石确实有多个任务,比如一些有趣的事情:

name, address1, address2, city, step = record.split(',') # split a CSV record into multiple fields 
+0

噢好吧,我已经看过格式化(使用逗号)之前,只是在我猜测之前我从未见过两个等号。谢谢! – GangstaGraham 2013-03-06 01:25:58

+0

这段代码在C语境中是误导性的;只有最后一个变量会分配给它。 – 2013-03-06 01:37:28

+0

的确如此,但他问其他语言是否有这样的约定,因此它回答了问题(它被标记为Ruby)。 – 2013-03-06 01:38:24