请考虑以下C++标准ISO/IEC 14882:2003(E)引用(第5节,第4段):
除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的.53)在前一个和下一个序列点之间,标量对象应通过表达式的计算最多修改其存储值一次.此外,只能访问先前值以确定要存储的值.对于完整表达式的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义.[例:
Run Code Online (Sandbox Code Playgroud)i = v[i++]; // the behavior is unspecified i = 7, i++, i++; // i becomes 9 i = ++i + 1; // the behavior is unspecified i = i + 1; // the value of i is incremented- 末端的例子]
我很惊讶,i = ++i + 1给出了一个未定义的值i.有没有人知道编译器实现不能给出2以下情况?
int i = 0;
i = ++i + 1;
std::cout << i << std::endl;
Run Code Online (Sandbox Code Playgroud)
事情是operator=有两个args.第一个总是i参考.在这种情况下,评估顺序无关紧要.除了C++ Standard禁忌之外,我没有看到任何问题.
请,不要不考虑这样的情况下,参数的顺序是评价非常重要.例如, …
这是我正在寻找的一个例子:
>> foo = [88, 12];
>> [x, y] = foo;
Run Code Online (Sandbox Code Playgroud)
之后我会期待这样的事情:
>> x
x =
88
>> y
y =
12
Run Code Online (Sandbox Code Playgroud)
但相反,我得到的错误如下:
??? Too many output arguments.
Run Code Online (Sandbox Code Playgroud)
我想deal()可能会这样做,但它似乎只适用于细胞.
>> [x, y] = deal(foo{:});
??? Cell contents reference from a non-cell array object.
Run Code Online (Sandbox Code Playgroud)
我该如何解决我的问题?如果我想单独处理它们,我必须经常索引1和2吗?
运行以下代码:
// In Java, output #####
public static void main(String[] args) {
int i = 1;
if(i == (i = 2)) {
System.out.println("@@@@@");
} else {
System.out.println("#####");
}
}
Run Code Online (Sandbox Code Playgroud)
但:
// In C, output @@@@@?I did test on Clion(GCC 7.3) and Visual Studio 2017
int main(int argc, char *argv[]) {
int i = 1;
if(i == (i = 2)) {
printf("@@@@@");
} else {
printf("#####");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
提出这个问题的动机来自以下代码:
// The code is from the JDK 11 - java.util.concurrent.atomic.AtomicInteger …Run Code Online (Sandbox Code Playgroud) 在钢琴应用程序中,我正在分配黑键的坐标.这是导致错误的代码行.
'blackKey'和'whiteKey'都是customViews
blackKey.center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
Run Code Online (Sandbox Code Playgroud) 目前正试图了解Elixir中的"^"运算符.来自网站:
当没有兴趣重新绑定变量而是匹配匹配之前的值时,可以使用pin运算符^:
来源 - http://elixir-lang.org/getting_started/4.html
考虑到这一点,您可以将新值附加到符号,如下所示:
iex> x = 1 # Outputs "1"
iex> x = 2 # Outputs "2"
Run Code Online (Sandbox Code Playgroud)
我也可以这样做:
iex> x = x + 1 # Outputs "3"!
Run Code Online (Sandbox Code Playgroud)
所以我的第一个问题是; Elixir变量是否可变? 看起来确实如此......在函数式编程语言中,这应该是不可能的?
所以现在我们来到"^"运算符......
iex> x = 1 # Outputs "1"
iex> x = 2 # Outputs "2"
iex> x = 1 # Outputs "1"
iex> ^x = 2 # "MatchError"
iex> ^x = 1 # Outputs "1"
Run Code Online (Sandbox Code Playgroud)
我认为"^"的效果是将"x"锁定到绑定到它的最后一个值.这就是它的全部吗?为什么不确保所有'匹配'/赋值都像Erlang本身一样不可变?
我刚刚习惯了......
erlang functional-programming immutability elixir variable-assignment
在Java中,允许以下内容:
char c = 'A' + 1;
Run Code Online (Sandbox Code Playgroud)
这里,c将保持值'B'.在上面,首先评估表达式.所以'A'被转换为65,整个表达式的计算结果为66,然后66被转换为'B',因为我们将值存储在char中.
但是,以下内容会产生编译时错误:
char c = 'A';
c = c + 1;
Run Code Online (Sandbox Code Playgroud)
Java如何以不同方式查看表达式的解释是什么?顺便说一句,以下工作也很好:
char c = 'A';
c++;
Run Code Online (Sandbox Code Playgroud) 如果我说let 5 = 10,为什么5 + 1返回6而不是11?
haskell pattern-matching variable-assignment let assignment-operator
如果我想在另一个(在C中)复制一个结构,那么pro&con's是什么:
struct1 = struct2;
Run Code Online (Sandbox Code Playgroud)
VS
memcpy(&struct1, &struct2, sizeof(mystruct_t));
Run Code Online (Sandbox Code Playgroud)
它们是等价的吗?性能或内存使用有区别吗?
我看了这个视频.为什么a = a评估nil是否a未定义?
a = a # => nil
b = c = q = c # => nil
Run Code Online (Sandbox Code Playgroud) 我正在使用PyQt库获取网页的屏幕截图,然后阅读不同URL的CSV文件.我保留一个变量Feed,每次处理URL时都会增加,因此应该增加到URL的数量.
这是代码:
webpage = QWebPage()
fo = open("C:/Users/Romi/Desktop/result1.txt", "w")
feed = 0
def onLoadFinished(result):
#fo.write( column1[feed])#, column2[feed], urls[feed])
#feed = 0
if not result:
print "Request failed"
fo.write(column1[feed])
fo.write(',')
fo.write(column2[feed])
fo.write(',')
#fo.write(urls[feed])
fo.write(',')
fo.write('404,image not created\n')
feed = feed + 1
sys.exit(1)
save_page(webpage, outputs.pop(0)) # pop output name from list and save
if urls:
url = urls.pop(0) # pop next url to fetch from list
webpage.mainFrame().load(QUrl(url))
fo.write(column1[feed])#,column2[feed],urls[feed],'200','image created','/n')
fo.write(',')
fo.write(column2[feed])
fo.write(',')
#fo.write(urls[feed])
fo.write(',')
fo.write('200,image created\n')
feed = feed + 1 …Run Code Online (Sandbox Code Playgroud) c ×2
java ×2
arrays ×1
c++ ×1
cgrect ×1
char ×1
elixir ×1
erlang ×1
haskell ×1
immutability ×1
int ×1
ios ×1
let ×1
matlab ×1
memcpy ×1
objective-c ×1
python ×1
python-2.7 ×1
python-3.x ×1
ruby ×1
side-effects ×1
standards ×1
struct ×1
variables ×1