半开玩笑地半开玩笑:为什么我不能++i++用C语言,特别是在C#中?
我希望它增加值,在我的表达式中使用它,然后再次递增.
注意:请注意,下面的代码基本上没有意义,仅用于说明目的.
基于这样一个事实,即在将赋值分配给左侧变量之前必须始终对赋值的右侧进行求值,并且在评估之后始终执行诸如++和--之后的递增操作,我不会期望以下代码工作:
string[] newArray1 = new[] {"1", "2", "3", "4"};
string[] newArray2 = new string[4];
int IndTmp = 0;
foreach (string TmpString in newArray1)
{
newArray2[IndTmp] = newArray1[IndTmp++];
}
Run Code Online (Sandbox Code Playgroud)
相反,我希望newArray1[0]被分配到newArray2[1],newArray1[1]对newArray[2]等多达扔的地步System.IndexOutOfBoundsException.相反,令我惊讶的是,抛出异常的版本是
string[] newArray1 = new[] {"1", "2", "3", "4"};
string[] newArray2 = new string[4];
int IndTmp = 0;
foreach (string TmpString in newArray1)
{
newArray2[IndTmp++] = newArray1[IndTmp];
}
Run Code Online (Sandbox Code Playgroud)
因为,在我的理解中,编译器首先评估RHS,将其分配给LHS,然后才增加这对我来说是一个意外的行为.或者它真的是预期的,我显然错过了什么?
如果我有一个带有实例方法和变量的类
class Foo
{
...
int x;
int bar() { return x++; }
};
Run Code Online (Sandbox Code Playgroud)
是否定义了返回后递增变量的行为?
我正在做一些关于Java的研究,发现这很令人困惑:
for (int i = 0; i < 10; i = i++) {
System.err.print("hoo... ");
}
Run Code Online (Sandbox Code Playgroud)
这是永无止境的循环!
任何人都有很好的解释为何会发生这样的事情
我正在学习编程,我从C语言开始.我正在读我们的C书.我正在那本书中学习这个课程.
main( )
{
int a[5] = { 5, 1, 15, 20, 25 } ;
int i, j, k = 1, m ;
i = ++a[1] ;
j = a[1]++ ;
m = a[i++] ;
printf ( "\n%d %d %d", i, j, m ) ;
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,它将打印i as 2,j as 1和m as 15
但不知何故,它打印为 i as 3,j as 2和m as 15?为什么会这样?
以下是我的理解 -
b = x++;
In this example suppose …Run Code Online (Sandbox Code Playgroud) 我正试图深入了解post和pre incrementors,但是我对以下表达式有点困惑:
public static void main(String[] args) {
int i = 0;
i = i+=(++i + (i+=2 + --i) - ++i);
// i = 0 + (++i + (i+=2 + --i) - ++i);
// i = 0 + (1 + (3 + 2) - 1);
// i = 0 + (6 - 1);
System.out.println(i); // Prints 0 instead of 5
}
Run Code Online (Sandbox Code Playgroud)
我知道我在哪里错过了逻辑,但在哪里?
我尝试过的:
谢谢您的帮助
PS:评论是我的微积分的细节
编辑1
我试图将de hard编码值从表达式2改为其他东西,结果总是给出0
看看这个例子:
int i = 0;
i = …Run Code Online (Sandbox Code Playgroud) 我的兴趣在于for和while循环之间的区别.我知道使用后增量值然后递增,操作返回一个恒定的预增量.
while (true) {
//...
i++;
int j = i;
}
Run Code Online (Sandbox Code Playgroud)
在这里,将j包含循环结束时的旧i或后递增i?
可能重复:
C,C++,Java和C#中的前后增量运算符行为
这是一个测试用例:
void foo(int i, int j)
{
printf("%d %d", i, j);
}
...
test = 0;
foo(test++, test);
Run Code Online (Sandbox Code Playgroud)
我希望得到一个"0 1"输出,但我得到"0 0"什么给了??
在编程类,教授教我们关于x++和++x,其中x是一个整数.
他说,在方案中,我们可以只是把两种x++或++x,++x是更有效的(一点,但还是在理论上,更高效尽管如此).
但我忘记了原因.有谁知道?这是Java.
我不确定下面的陈述是否由标准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仅被评估一次.