来自某事的引用:
>>> x = y = somefunction()
Run Code Online (Sandbox Code Playgroud)
是相同的
>>> y = somefunction()
>>> x = y
Run Code Online (Sandbox Code Playgroud)
问题:是
x = y = somefunction()
Run Code Online (Sandbox Code Playgroud)
同样的
x = somefunction()
y = somefunction()
Run Code Online (Sandbox Code Playgroud)
?
根据我的理解,它们应该是相同的,因为somefunction
只能返回一个值.
比方说,我有一个有一组整数的类
foo()
{
int a;
int b;
int c;
int d;
....
string s;
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是最好的可读性,foo()的init()函数,如果它看起来像
void init()
{
a=b=c=d=1; //for some reason they are init to 1;
s = "abc";
}
Run Code Online (Sandbox Code Playgroud)
要么
void init()
{
a=1;
b=1;
c=1;
d=1;
s = "abc";
}
Run Code Online (Sandbox Code Playgroud)
?
类中字符串的原因是可能存在其他相同类型的组的提示,当然,类可能会随着需求的变化而增长
编辑:在这个问题走得太远之前,这个问题的意图很简单:在Effective C++第12项中(更喜欢初始化到构造函数中的赋值),Scott使用链赋值而不是a = c; B = C; 我确定他知道什么时候使用什么,但我也记得我读过的书也建议使用int a; int b; 在类似的作业情况下.在我的程序中我有一个类似的情况,需要初始化一组相关的单个内置类型,我发现通过使链分配确实使它更容易阅读,特别是如果类有许多其他不同类型的实例变量.它似乎与我读过的书和我的记忆相矛盾,因此这个问题.
有人可以解释这是什么以及它是如何合法的C代码?我在此代码中找到了这一行:http://code.google.com/p/compression-code/downloads/list,这是用于自适应霍夫曼编码的Vitter算法的C实现
ArcChar = ArcBit = 0;
Run Code Online (Sandbox Code Playgroud)
从功能:
void arc_put1 (unsigned bit)
{
ArcChar <<= 1;
if( bit )
ArcChar |= 1;
if( ++ArcBit < 8 )
return;
putc (ArcChar, Out);
ArcChar = ArcBit = 0;
}
Run Code Online (Sandbox Code Playgroud)
ArcChar是一个int
而ArcBit是一个unsigned char
以下代码是否调用未定义的行为C
?
int a = 1, b = 2;
a = b = (a + 1);
Run Code Online (Sandbox Code Playgroud)
我知道以下内容会调用UB:
a = b = a++;
Run Code Online (Sandbox Code Playgroud)
原因是它违反了标准中的以下条款:
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,只能访问先前值以确定要存储的值.
但是,第一个代码段不违反此条款.一位同事说这种说法a = b = a+1
也可能意味着
a = a + 1;
b = a + 1;
Run Code Online (Sandbox Code Playgroud)
要么
b = a + 1;
a = b;
Run Code Online (Sandbox Code Playgroud)
我认为,由于"从右到左"的相关性=
,它总是必须意味着a = (b = (a+1))
,而不是
a = a + 1;
b = a + 1;
Run Code Online (Sandbox Code Playgroud)
不过,我并不积极.是UB吗?