我有一个图片模型,其中包含视图计数(整数)的变量.每当有人查看Picture对象时,视图计数就会增加+1.
完成这项工作后,有什么区别
@picture.view_count += 1
@picture.save
Run Code Online (Sandbox Code Playgroud)
和
@picture.increment(:view_count, 1)
Run Code Online (Sandbox Code Playgroud)
如果我使用增量,还是.save必要吗?
可能重复:
为什么会进入无限循环?
类似于i = i++
C和C++中的未定义行为,因为标量对象的值在同一表达式中更改两次而没有插入序列点.
但是我认为这些表达式在C#或Java中具有明确定义的行为,因为AFAIK对参数的评估从左到右,并且全部都有序列点.
那就是说,我希望i = i++
相当于i++
.但事实并非如此.以下程序输出0
.
using System;
class Program
{
static void Main(string[] args)
{
int i = 0;
i = i++;
Console.WriteLine(i);
}
}
Run Code Online (Sandbox Code Playgroud)
你能帮我理解为什么吗?
免责声明: 我完全清楚,无论是否定义了上述结构的行为,它们都是愚蠢,无用,不可读,不必要的,不应在代码中使用.我只是好奇.
在C或C++中,当运算符在运算符中时,不执行递增和递减运算符(++n
,--n
)sizeof()
.
int n = 100;
int size_int = sizeof(++n);
std::cout<<n;
Run Code Online (Sandbox Code Playgroud)
我编写了这段代码并运行程序.当然,我认为101将会为我展示.但是,n
不是101,它是100.
这是为什么?
我使用整数作为计数器.整数只会增加,肯定会有多个线程同时增加它.在没有其他线程尝试访问其值时,在程序执行结束时读取此计数器的值.
我假设我不必为这种仅增量计数器使用锁或任何类型的同步.这是正确的吗?如果这有任何区别,我用Java编写代码.
在Python中,在增加密钥之前必须首先检查密钥是否在字典中是很烦人的:
if key in my_dict:
my_dict[key] += num
else:
my_dict[key] = num
Run Code Online (Sandbox Code Playgroud)
以上四条线是否有较短的替代品?
以下两个C#代码片段产生不同的结果(假设在递归调用之前和之后都使用变量级别).为什么?
public DoStuff(int level)
{
// ...
DoStuff(level++);
// ...
}
Run Code Online (Sandbox Code Playgroud)
,
public DoStuff(int level)
{
// ...
DoStuff(level+1);
// ...
}
Run Code Online (Sandbox Code Playgroud)
在阅读了下面的一些回复后,我认为值得发布级别++,++级别和级别+ 1的堆栈跟踪以突出显示欺骗这个问题的方式.
我已经为这篇文章简化了它们.递归调用序列以DoStuff(1)开始.
// level ++
DoStuff(int level = 1)
DoStuff(int level = 2)
DoStuff(int level = 2)
DoStuff(int level = 2)
Run Code Online (Sandbox Code Playgroud)
// ++级别
DoStuff(int level = 4)
DoStuff(int level = 4)
DoStuff(int level = 3)
DoStuff(int level = 2)
Run Code Online (Sandbox Code Playgroud)
// level + 1
DoStuff(int level = 4)
DoStuff(int level = 3)
DoStuff(int level = 2)
DoStuff(int level …
Run Code Online (Sandbox Code Playgroud) 增加/减少数字和/或数字变量的惯用 Common Lisp方法是什么?
以下是我的代码的简化版本:
<?php for($n=1; $n<=8; $n++): ?>
<p><?php echo $n; ?></p>
<p><?php echo $n; ?></p>
<?php endfor; ?>
Run Code Online (Sandbox Code Playgroud)
我希望循环运行8次,我希望第一段中的数字在每个循环中增加1,例如
1, 2, 3, 4, 5, 6, 7, 8
(这显然很简单)
但是,我希望第二段中的数字在每个循环中增加2,例如..
1, 3, 5, 7, 9, 11, 13, 15
我无法弄清楚如何使每个循环使第二段中的数字增加2.如果我将其更改为$ n ++然后它会增加2,但它会使循环仅运行4次而不是8次.
任何帮助将非常感激.谢谢!
这是一个例子
#include <iostream>
using namespace std;
int main()
{
int x = 0;
cout << (x == 0 ? x++ : x) << endl; //operator in branch
cout << "x=" << x << endl;
cout << (x == 1 || --x == 0 ? 1 : 2) << endl; //operator in condition
cout << "x=" << x << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
x=1
1
x=1
Run Code Online (Sandbox Code Playgroud)
我理解输出,但这是不确定的行为?在任何一种情况下,评估顺序是否得到保证?
即使有保证,我也非常清楚使用递增/递减会很快成为可读性的问题.我只是问我看到类似的代码并且立即不确定,因为有很多关于递增/递减运算符的模糊/未定义使用的示例,例如......
C++没有定义评估函数参数的顺序.↪
int nValue = Add(x, ++x);
Run Code Online (Sandbox Code Playgroud)C++语言表示你不能在序列点之间多次修改变量.↪
x …
Run Code Online (Sandbox Code Playgroud)来自Ira Baxter回答,为什么INC和DEC指令不会影响进位标志(CF)?
大多数情况下,我远离
INC
而DEC
现在,因为他们做的部分条件代码更新,这样就可以在管道中引起滑稽的摊位,和ADD
/SUB
没有.因此,无关紧要(大多数地方),我使用ADD
/SUB
避免失速.我使用INC
/DEC
仅在保持代码较小的情况下,例如,适合高速缓存行,其中一个或两个指令的大小产生足够的差异.这可能是毫无意义的纳米[字面意思!] - 优化,但我在编码习惯上相当老派.
我想问一下为什么它会导致管道中的停顿,而添加不会?毕竟,无论是ADD
和INC
更新标志寄存器.唯一的区别是INC
不更新CF
.但为什么重要呢?