这是一个例子
#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)为什么x86指令INC
(递增)和DEC
(递减)不影响CF
FLAGSREGISTER中的(进位标志)?
Date::Simple
对象显示此行为,$date++
返回第二天的日期.
Date ::简单对象是不可变的.将$ date1分配给$ date2后,$ date1的更改不会影响$ date2.这意味着,例如,没有像set_year操作,$ date ++将新对象分配给$ date.
如何自定义对象的前/后增量行为,以便执行++$object
或$object--
执行特定操作?
我已经浏览了perlboot,perltoot,perltooc和perlbot,但我没有看到任何显示如何做到这一点的例子.
当使用MySQL START TRANSACTION并由MySQL做出回滚决定时 - 如果一个表有一个AUTO_INCREMENT列 - 在回滚期间列是否会减少?
还是应该呢?
我遇到了一些问题,其中事务数据正在被正确回滚 - 但看起来表是自动递增的并且在回滚中没有减少.
# BOTH TABLES START OUT EMPTY // TABLE1 ID is **auto_increment**
START TRANSACTION;
INSERT INTO `TABLE1` (`ID` ,`NAME`) VALUES (NULL , 'Ted'); # MySQL TABLE1 **ID** is Auto incremented to 1
INSERT INTO `TABLE2` (`ID` ,`WRONGVALUE`) VALUES (NULL , 'some value'); # error. This TRANSACTION will not succeed
COMMIT; # Because of the error - this TRANSACTION is now rolled back and Ted is NOT added
Run Code Online (Sandbox Code Playgroud)
因为MySQL会自动增加第一个表上的ID - 无论事务成功还是失败 …
我正在看一些Don Knuth教授的代码,用CWEB编写,转换为C.具体的例子是dlx1.w,可从Knuth的网站获得
在一个阶段,struct nd [cc]的.len值递减,并且以一种笨重的方式完成:
o,t=nd[cc].len-1;
o,nd[cc].len=t;
Run Code Online (Sandbox Code Playgroud)
(这是一个特定于Knuth的问题,所以也许你已经知道"o"是一个预处理器宏,用于递增"mems",这是通过访问64位字来衡量的累计工作量.) "t"中剩余的值绝对不会用于其他任何事情.(此处的示例位于dlx1.w的第665行,或者是ctangle之后的dlx1.c的第193行.)
我的问题是:为什么Knuth这样写,而不是
nd[cc].len--;
Run Code Online (Sandbox Code Playgroud)
他确实在其他地方使用过(dlx1.w第551行):
oo,nd[k].len--,nd[k].aux=i-1;
Run Code Online (Sandbox Code Playgroud)
(而"oo"是一个类似的宏,用于递增"mems"两次 - 但这里有一些细微之处,因为.len和.aux存储在相同的64位字中.为S.len和S分配值. aux,通常只计算mems的一个增量.)
我唯一的理论是减量包括两个内存访问:首先查找,然后分配.(这是正确的吗?)这种写作方式提醒了这两个步骤.这对于Knuth来说会非常冗长,但也许这是一种本能的备忘录,而不是说教.
为了它的价值,我在没有找到答案的情况下搜索了CWEB文档.我的问题可能更多地与Knuth的标准实践有关,我正在逐渐采用.我会对这些实践被布局(并且可能被批评)作为一个块的任何资源感兴趣 - 但是现在,让我们关注为什么Knuth以这种方式编写它.
(注意:我不是在询问预增量与后增量的定义,或者它们在C/C++中的使用方式.因此,我不认为这是一个重复的问题.)
C的开发人员(Dennis Ritchie等人)出于很好的理由创建了增量和减量运算符.我不明白为什么他们决定创造前后增量/减量的区别?
我的感觉是,当C开发时,这些运算符比今天更有用.大多数C/C++程序员使用其中一种,而来自其他语言的程序员今天发现这种区别奇怪且令人困惑(注意:这完全基于轶事证据).
他们为什么决定这样做,以及计算上发生了什么变化,这种区别今天没那么有用?
为了记录,可以在C++代码中看到两者之间的差异:
int x = 3;
cout << "x = 3; x++ == " << x++ << endl;
cout << "++x == " << ++x << endl;
cout << "x-- == " << x-- << endl;
cout << "--x == " << --x << endl;
Run Code Online (Sandbox Code Playgroud)
将作为输出
x++ == 3
++x == 5
x-- == 5
--x == 3
Run Code Online (Sandbox Code Playgroud) 我试图在java中的另一个线程中访问和修改线程的变量,我真的不知道如何做到这一点.
例如:
Runnable r1 = new Runnable() {
int value = 10;
public void run() {
// random stuff
}
}
Runnable r2 = new Runnable() {
public void run() {
// of course the bellow line will not work
r1.value--; // I want here to be able to decrement the variable "value" of r1
}
}
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
Run Code Online (Sandbox Code Playgroud)
谢谢你,如果你有任何想法!
有没有办法在java中为线程创建一个getter和setter?
编辑:答案很好,但我不清楚我的问题,我会尝试提出一个更好的问题
同学向我提到他读的减量器 (--
)应该比增量器 (++
)更快地执行操作.我们使用JavaScript进行了测试,得出了混合结果.
在我的MacBook Pro酷睿i5(2014年中期),++
是快了近3倍比--
当使用console.time方法登录的差异铬,并在Firefox中 ++
只是勉强挤掉--
.
在他的Windows笔记本电脑上(不确定型号),几乎完全相反,--
在浏览器中速度更快.
那么发生了什么?这是硬件还是软件?有什么区别以及为什么一个或另一个以更高或更低的速度运行?
这里的问题是为什么不同的机器有区别? 比较为0似乎是一个明显的答案,为什么我们看到我的MacBook上的减量速度较慢,但它并没有解释为什么它在窗口的机器上实际上更快.
我们预计两种情况下的减量都会变慢,只是测试差异,然后我们想出了这个奇怪的结果.因此这个问题.
当我尝试在/减量中写一个后缀/前缀,然后在/减量中写一个post /前缀时,我得到以下错误:操作++/ - 的参数无效.
但是,据JLS称:
PostIncrementExpression:
PostfixExpression ++
Run Code Online (Sandbox Code Playgroud)
和
PostfixExpression:
Primary
ExpressionName
PostIncrementExpression
PostDecrementExpression
Run Code Online (Sandbox Code Playgroud)
所以写:
PostfixExpression ++ ++
Run Code Online (Sandbox Code Playgroud)
应该可能......有什么想法吗?
我在我的gcc上尝试过这个:
int a=1;
cout<<(--a)--;
Run Code Online (Sandbox Code Playgroud)
输出为0; 但改成它
cout<<--(a--);
Run Code Online (Sandbox Code Playgroud)
导致错误(减值操作数需要左值).有人可以告诉我这件事吗?
谢谢!