标签: compound-assignment

Java 复合赋值运算符在表达式中的优先级

当我尝试执行以下代码时,其输出被声明为“6”。

当我试图思考这个问题时,表达式“k += 3 + ++k; 应该被评估为 k = k + (3 + ++k); 但在这种情况下,输出应该是 7。看起来就像它被评估为 k = k + 3 + ++k; 结果是 6。

有人可以解释一下为什么表达式被计算为“k + 3 + ++k”而不是“ k + (3 + ++k); 吗?

public class TestClass {

public static int m1(int i){
    return ++i;
}

public static void main(String[] args) {

    int k = m1(args.length);
    k += 3 + ++k;
    System.out.println(k);
}
Run Code Online (Sandbox Code Playgroud)

}

java expression compound-assignment

3
推荐指数
1
解决办法
664
查看次数

C:使用错误:"化合物分配"和"前缀减量"一起使用

有人可以告诉我为什么C编译器在使用a Compound Assignment和a Prefix Dec/Inc时输出错误?[但C++不]

int myVar = 5;
(--myVar) -= 4;
// C  : error C2106: '-=' : left operand must be l-value
// C++: myVar=0;
Run Code Online (Sandbox Code Playgroud)

我知道错误说的是什么......

但是,我无法理解为什么C编译器无法识别myVar为l值而是C++

c c++ compiler-errors prefix-operator compound-assignment

3
推荐指数
1
解决办法
104
查看次数

为什么在unsigned char之间添加隐式转换?

GCC警告此代码:

unsigned char i = 1;
unsigned char j = 2;
i += j;
Run Code Online (Sandbox Code Playgroud)

说:

warning: conversion to 'unsigned char' from 'int' may alter its value [-Wconversion]
   i += j;
        ^
Run Code Online (Sandbox Code Playgroud)

它似乎j被隐式转换为int.
为什么添加相同类型变量会发生隐式转换?

c integer-promotion compound-assignment

3
推荐指数
1
解决办法
272
查看次数

C++ 中的复合赋值

我想知道C++中复合赋值的执行流程。我遇到了一个CodeChef 问题,其中我正在计算 NCR mod p 值并将它们加在一起以获得最终答案:

// correct
for(int i=min1; i<=max1; i+=2){
     ans = (ans+ncr_mod_p(n,i))%mod;
}
Run Code Online (Sandbox Code Playgroud)
// incorrect
for(int i=min1; i<=max1; i+=2){
     ans+=ncr_mod_p(n,i)%mod;
}
Run Code Online (Sandbox Code Playgroud)

这是由于整数溢出而发生的。

那么,复合赋值的执行顺序是怎样的呢?

比方说,如果我们有一个方程a+=b%c,那么执行顺序是什么:

a = (a+b)%c
// OR
a = a+(b)%c;
Run Code Online (Sandbox Code Playgroud)

c++ assignment-operator compound-assignment

3
推荐指数
2
解决办法
318
查看次数

C中的复合运算符(+=)和&amp;&amp;,奇怪的值

看看这段代码:

#include <stdio.h>
#include <stdlib.h>

int main(){
  int a = -1;
  int b = 0xfc; // = 252
  b+=a && a++;
  printf("%d %d\n", a, b);
}
Run Code Online (Sandbox Code Playgroud)

我认为应该是输出:

0 251
Run Code Online (Sandbox Code Playgroud)

实际上,真正的输出是:

0 253
Run Code Online (Sandbox Code Playgroud)

但为什么?&& 的结合性是从左到右,所以

  1. b = b - 1(a)(b 应该是 251)
  2. 左边部分是真的,所以:a++ (a = 0)

我的假设有问题,有人可以向我解释一下吗?

如果可以帮助 gdb 的输出(带有指向 a 和 b 的观察点):

Old value = 0
New value = -1
main () at test.c:7
7         int b = 0xfc;
(gdb) c
Continuing.

Hardware watchpoint 2: b

Old value = …
Run Code Online (Sandbox Code Playgroud)

c compound-assignment output

3
推荐指数
1
解决办法
59
查看次数

c:这条线做什么?

我读了一些代码并且遇到了这个相当神秘的语法:

size_t count = 1;
char *s         = "hello you";
char *last_word = "there";

count += last_word < (s + strlen(s) - 1); #line of interest
Run Code Online (Sandbox Code Playgroud)

不知何故,计数增加了.但我认为<运算符会返回true或false.这条线做什么?

c addition operator-precedence compound-assignment relational-operators

2
推荐指数
1
解决办法
111
查看次数

什么时候是bool的右手表达a | = mayRun(); 被执行?

假设代码片段

bool a;
a = true;
a |= mayRun();

a = false;
a |= mayRun();
Run Code Online (Sandbox Code Playgroud)

在哪种情况下mayRun()被执行?

所有解释都告诉我,这 a |= b; 相当于 a = a | b;

但它不能与示例arr[i++] |= b; 所示相同 .

c++ compiler-construction compound-assignment

1
推荐指数
2
解决办法
101
查看次数

如何将多个数字添加到变量

我正在尝试+=将多个数字添加到变量中。

我正在尝试做这样的事情: score += var1, var2, var3

然而,我现在唯一知道该怎么做的是

score += p;
score += v;
score += t;
Run Code Online (Sandbox Code Playgroud)

c++ variables variable-assignment compound-assignment

1
推荐指数
1
解决办法
80
查看次数

使用复合乘法语句时得到错误的结果 - C#

我注意到一些非常奇怪的事情。在下面的代码片段中,控制台输出的结果总是0

int result = 0;
for(int i = 1; i < 4; i++)
{
  result *= 10 + i;
}
Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)

它看起来result *= 10 + i;总是10result(where resultis 0)相乘而不是相加i

如果我只改变乘法线...

int result = 0;
for(int i = 1; i < 4; i++)
{
  result = result * 10 + i;
}
Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)

这会result在控制台上输出正确的 - 即123.

我的问题是,为什么result *= 10 + i;不能正常工作 - 并且总是给出resultas …

c# multiplication compound-assignment

1
推荐指数
1
解决办法
36
查看次数

.Net 中的复合赋值

我想知道 .Net 中是否曾经或仍然存在过这种情况。

使用 exp += val 而不是 exp = exp + val。由于 exp 可以任意复杂,这可能会导致大量不必要的工作。这迫使 JIT 评估 exp 的两个副本,但很多时候这是不需要的。第一个语句的优化效果比第二个语句好得多,因为 JIT 可以避免对 exp 求值两次。

这是来自 codeproject 中的一篇古老文章。

cpp中还有另外一个:

但是,复合赋值表达式并不等同于扩展版本,因为复合赋值表达式仅对 expression1 求值一次,而扩展版本对 expression1 求值两次:在加法运算和赋值运算中。

.net c# optimization language-lawyer compound-assignment

0
推荐指数
1
解决办法
1704
查看次数