当我尝试执行以下代码时,其输出被声明为“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)
}
有人可以告诉我为什么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++?
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++中复合赋值的执行流程。我遇到了一个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) 看看这段代码:
#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)
但为什么?&& 的结合性是从左到右,所以
我的假设有问题,有人可以向我解释一下吗?
如果可以帮助 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) 我读了一些代码并且遇到了这个相当神秘的语法:
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
假设代码片段
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;
所示相同
.
我正在尝试+=将多个数字添加到变量中。
我正在尝试做这样的事情:
score += var1, var2, var3
然而,我现在唯一知道该怎么做的是
score += p;
score += v;
score += t;
Run Code Online (Sandbox Code Playgroud) 我注意到一些非常奇怪的事情。在下面的代码片段中,控制台输出的结果总是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;总是10与result(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 …
我想知道 .Net 中是否曾经或仍然存在过这种情况。
使用 exp += val 而不是 exp = exp + val。由于 exp 可以任意复杂,这可能会导致大量不必要的工作。这迫使 JIT 评估 exp 的两个副本,但很多时候这是不需要的。第一个语句的优化效果比第二个语句好得多,因为 JIT 可以避免对 exp 求值两次。
这是来自 codeproject 中的一篇古老文章。
cpp中还有另外一个:
但是,复合赋值表达式并不等同于扩展版本,因为复合赋值表达式仅对 expression1 求值一次,而扩展版本对 expression1 求值两次:在加法运算和赋值运算中。
c ×4
c++ ×4
c# ×2
.net ×1
addition ×1
expression ×1
java ×1
optimization ×1
output ×1
variables ×1