我的程序之一超出了我使用的时间限制fans = fans + s[i],而当我正在使用fans += s[i]它的时候却被接受了……为什么会发生这种情况?为了进一步说明,迷是一个字符串,而s也是一个字符串,因此在遍历字符串si时只需要s的一些字符,因此我创建了一个新的字符串迷。现在有两种方法可以在新字符串中添加字符粉丝 问题在下面提到
fans = fans + s[i]; // gives Time limit exceeded
fans += s[i]; // runs successfully
Run Code Online (Sandbox Code Playgroud) 最近我看到一个代码使用这个:
boolean val = something();
val |= somethingElse();
Run Code Online (Sandbox Code Playgroud)
有趣的部分是| =(二进制)运算符在布尔基元类型上制作.
令我感到惊讶的是,布尔值存在| =存在,好像它是整数类型,并搜索此运算符的Java规范,但找不到任何.
如果左值已经为真,我会好奇是否评估右操作数.
有人能指出我的Java规范吗?
java specifications operators boolean-expression compound-assignment
在Bluebird图书馆的wiki中有一篇文章优化杀手.在本文中有一个短语:
目前不可优化:
...
包含复合的
函数let赋值包含复合const赋值的函数
复合赋值和复合const赋值是什么意思?在ECMAScript 5.1中有复合赋值的概念,但在ECMAScript 2015中,似乎没有任何复合赋值的概念,只有常规赋值.
我怀疑复合let和const赋值,它只是声明后的复合赋值.例如:
let n = 1;
n += 4;
Run Code Online (Sandbox Code Playgroud)
我对吗?
我尝试使用XOR在不使用第三个变量的情况下在Java中交换两个整数的代码.
以下是我尝试的两个交换函数:
package lang.numeric;
public class SwapVarsDemo {
public static void main(String[] args) {
int a = 2984;
int b = 87593;
swapDemo1(a,b);
swapDemo2(a,b);
}
private static void swapDemo1(int a, int b) {
a^=b^=a^=b;
System.out.println("After swap: "+a+","+b);
}
private static void swapDemo2(int a, int b) {
a^=b;
b^=a;
a^=b;
System.out.println("After swap: "+a+","+b);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码生成的输出如下:
After swap: 0,2984
After swap: 87593,2984
Run Code Online (Sandbox Code Playgroud)
我很想知道,为什么这句话:
a^=b^=a^=b;
Run Code Online (Sandbox Code Playgroud)
与此不同?
a^=b;
b^=a;
a^=b;
Run Code Online (Sandbox Code Playgroud) 我不确定下面的陈述是否由标准C明确定义
*p1++ += 2;
Run Code Online (Sandbox Code Playgroud)
或其他类似声明:
*E1++ <operator>= E2
Run Code Online (Sandbox Code Playgroud)
从标准C关于后增量:
postfix ++运算符的结果是操作数的值.获得结果后,操作数的值递增.(即,将相应类型的值1添加到其中.)有关约束,类型和转换以及操作对指针的影响的信息,请参阅加法运算符和复合赋值的讨论.更新操作数的存储值的副作用应发生在前一个和下一个序列点之间.
关于coumpund-assignment:
E1 op = E2形式的复合赋值与简单赋值表达式E1 = E1 op(E2)的不同之处仅在于左值E1仅被评估一次.
我非常确信我已经发现,就C++ 0x而言,这i = ++i 并不是未定义的,但我无法判断是否有i += ++i明确定义的行为 .任何接受者?
令我震惊的是,以下代码将在没有警告的情况下编译:
public void test()
{
int value = 2000000000;
long increment = 1000000000;
value += increment;
}
Run Code Online (Sandbox Code Playgroud)
虽然这会产生编译时错误,正如您所期望的那样:
public void test()
{
int value = 2000000000;
long increment = 1000000000;
value = value + increment;
}
Run Code Online (Sandbox Code Playgroud)
我检查了一下,事实上,JLS(第15.26.2节)有这样的说法:
形式E1 op = E2的复合赋值表达式等效于E1 =(T)((E1)op(E2)),其中T是E1的类型,除了E1仅被评估一次.
这对我来说似乎很荒谬.为什么他们觉得有必要在这里明确投射?似乎自动类型转换无论如何都会处理扩展,并且像这样自动缩小几乎可以保证导致整数溢出.
据称"巧妙"(但实际上效率低下)交换两个整数变量而不是使用临时存储的方式通常涉及这一行:
int a = 10;
int b = 42;
a ^= b ^= a ^= b; /*Here*/
printf("a=%d, b=%d\n", a, b);
Run Code Online (Sandbox Code Playgroud)
但我想知道,复合赋值运算符^=不是序列点,是吗?这是否意味着它实际上是未定义的行为?
由于复合赋值和递增/递减运算符中的隐式转换,以下编译:
byte b = 0;
++b; b++; --b; b--;
b += b -= b *= b /= b %= b;
b <<= b >>= b >>>= b;
b |= b &= b ^= b;
Run Code Online (Sandbox Code Playgroud)
并且由于自动装箱和自动拆箱,以下还编译:
Integer ii = 0;
++ii; ii++; --ii; ii--;
ii += ii -= ii *= ii /= ii %= ii;
ii <<= ii >>= ii >>>= ii;
ii |= ii &= ii ^= ii;
Run Code Online (Sandbox Code Playgroud)
然而,以下代码段中的最后一行给出了编译时错误:
Byte bb = 0;
++bb; bb++; --bb; bb--; // ... okay …Run Code Online (Sandbox Code Playgroud) java autoboxing compiler-errors implicit-cast compound-assignment
java ×5
c++ ×4
c ×2
operators ×2
autoboxing ×1
bluebird ×1
c++11 ×1
javascript ×1
performance ×1
pointers ×1
stdstring ×1