这个问题绝对不是重复的,因为我不是指一般的 post/precrement 评估,而是专门指 lambda 表达式中增量的使用,这可证明是不同的。每个人都可以自由确认代码只会在您通常期望变量值增加的地方返回零。对此没有任何答复。
我很清楚后缀和前缀增量的不同评估和增量时刻。尽管如此,我还是不明白为什么这仅返回零:
Stream.iterate(0, e -> e++)
.limit(10)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
检查时,我看到 e 在第一次迭代期间被初始化为 0,然后递增。所以第二次迭代应该产生 e = 1,但显然它没有。我错过了什么?
此外,如果我反转增量,它会按预期工作,列出从 0 到 9 的所有数字:
Stream.iterate(0, e -> ++e)
.limit(10)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud) 我正在为我的决赛学习,我遇到了这个问题:
考虑以下PHP代码,在执行后写入输出
Run Code Online (Sandbox Code Playgroud)<?php $a=3; $b=$a++; IF($a>$b) { echo "a>$b"; } else if ($a == $b) { echo "a=$b"; } else { echo "a < $b"; } ?>
当我在我的文本编辑器中输出它时,我得到了a < 3,但我不明白为什么呢?
我认为a被分配给3并且b被分配给++ 3和3 == 3所以应该打印出== 3?
int z = 1;
System.out.println(z++ == ++z);
System.out.println(++z == z++);
Run Code Online (Sandbox Code Playgroud)
输出将是:
false
true
Run Code Online (Sandbox Code Playgroud)
我不明白为什么,请向我解释一下.
可能重复:
未定义的行为和序列点
我正在使用microsoft visual c ++.请看以下示例:
int n = 5;
char *str = new char[32];
strcpy(str, "hello world");
memcpy(&str[n], &str[n+1], 6+n--);
printf(str);
// output is "hell world"
Run Code Online (Sandbox Code Playgroud)
所以不可思议的是,我的编译器生成的代码首先递减n然后执行memcpy.以下来源将完成我预期的事情:
int n = 5;
char *str = new char[32];
strcpy(str, "hello world");
memcpy(&str[n], &str[n+1], 6+n);
n--;
printf(str);
// output is "helloworld"
Run Code Online (Sandbox Code Playgroud)
首先,我试着向自己解释一下.最后一个参数首先被压入堆栈,因此可以先对其进行求值.但我真的相信后递增/递减保证在下一个分号后进行评估.
所以我运行了以下测试:
void foo(int first, int second) {
printf("first: %i / second: %i", first, second);
}
int n = 10;
foo(n, n--);
Run Code Online (Sandbox Code Playgroud)
这将输出"first:10/second:10".
所以我的问题是:这种情况有没有明确的行为?有人能指出我描述这个的文件吗?我找到了编译器错误~~ OO ~~?
这个例子简直就是不再有意义了,它只是展示了我的问题而且单独运作.
有人可以解释为什么程序的输出是
0 1 1 3 1
void main(void)
{
int i=-1,j=0,k=1,l=2,m;
m=i++&&j++&&k++||l++;
printf("%d %d %d %d %d",i,j,k,l,m);
}
Run Code Online (Sandbox Code Playgroud)
主要关注的是"为什么k不增加".
FYI ..我正在用VC++编辑器Windows 7 32位编译程序.提前谢谢了.
我在最后一个命令行中发现了以下bash行为.对我来说,这完全出乎意料.
$ set | grep ^BASH_VERSINFO # Show the array
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
$ echo "${BASH_VERSINFO[@]}" # Print all array
3 2 25 1 release x86_64-redhat-linux-gnu
$ echo "${BASH_VERSINFO[@]%e}" # Print all array removing final 'e' of every member
3 2 25 1 releas x86_64-redhat-linux-gnu
$ i=4; echo "${BASH_VERSINFO[i]}" # Print an array member
release
$ i=4; echo "${BASH_VERSINFO[i++]}" # Print an array member and increase the 'i' variable
release
$ i=4; echo "${BASH_VERSINFO[i]%e}" # Print an …Run Code Online (Sandbox Code Playgroud) int x = 3;
int y = 5;
x++ = y;
cout << x << endl;
Run Code Online (Sandbox Code Playgroud)
为什么上面的代码给我一个错误,我得到的具体错误是
左值作为赋值的左操作数.
我正在尝试回顾我的C和C++.从我的理解,上面的代码理论上应该复制y到into 的值x,然后最后增加x复制完成后的值.所以它会打印出"6".
我有以下代码示例
int i = 1;
while(i != 0) {
i++;
}
Run Code Online (Sandbox Code Playgroud)
我期待这个在无限循环中运行,但事实并非如此.然后,当我在while循环后打印值时,我得到了:
i value is 0.
Run Code Online (Sandbox Code Playgroud)
谁能告诉我究竟发生了什么?
给出以下代码
int j = 0;
for (int i = 0; i < str.Length; ++i) {
if (i==j) {
Console.WriteLine ("equal");
}
j++;
}
Run Code Online (Sandbox Code Playgroud)
我预计++i会改变i,从最初0到1,从而i==j评价false.
但事实并非如此.为什么?
我有以下示例代码,其中我使用预先减少
void function(int c)
{
if(c == 0)
{
return;
}
else
{
cout << "DP" << c << endl;
function(--c);
cout << c << endl;
return;
}
}
Run Code Online (Sandbox Code Playgroud)
此函数为输入4提供输出:
DP3
DP2
DP1
DP0
0
1
2
3
Run Code Online (Sandbox Code Playgroud)
但是当我使用后减量时
void function(int c)
{
if(c == 0)
{
return;
}
else
{
cout << "DP" << c << endl;
function(c--);
cout << c << endl;
return;
}
}
Run Code Online (Sandbox Code Playgroud)
输出与DP4无限循环
你能详细解释一下为什么会这样吗?