你能简单解释一下我理解这个吗?
当我这样做:count = ++ count; 为什么我会收到警告 - 对变量计数的赋值没有效果?这意味着计数递增,然后分配给自己或其他东西?它和++ count一样吗?count = count ++中会发生什么??为什么我没有收到警告呢?
我知道这个问题已经讨论了好几次了,但我找不到一个解释为什么在后增量操作时需要复制的帖子.
引用stackoverflow回复:
int j = i++; // j will contain i, i will be incremented.
int j = ++i; // i will be incremented, and j will contain i+1.
Run Code Online (Sandbox Code Playgroud)
当考虑后/前增量的定义时,这是完全有意义的.很多时候,在比较前/后增量的性能时,可以说后增量需要复制,增加它并返回副本,而预增量只增加值而不创建副本.
虽然已经在数十篇帖子中对性能进行了比较,但我真的找不到为什么在后增量的情况下必须制作副本的任何解释.为什么不返回旧值,然后将变量的值增加1(或者操作符重载方式),而不是创建新对象并返回该对象.
我有一个C程序,它是使用数组的队列操作。在该程序中,它们在数组内增加一个变量。我不明白那是怎么回事。因此,请解释以下操作:
array[++i];
array[i++];
Run Code Online (Sandbox Code Playgroud) 我正在从缓冲区读取字节。但是有时候我读的是一个单词或更长时间。
// assume buffer is of type unsigned char *
read_ptr(buffer+(position++))
Run Code Online (Sandbox Code Playgroud)
很好,但是如何将位置增加2或4?我无法让+=操作员后期递增,是吗?
原因是,我有一个很糟糕的表达式要评估,同时要增加位置变量。
我想我想出了自己的解决方案。我很确定它能起作用。每个人都会讨厌它,因为这不是易读的代码。
read_ptr(buffer+(position+=4)-4)
Run Code Online (Sandbox Code Playgroud)
经过一点测试以确保它做对了之后,我将其放入宏中。
结论:
不要这样 这只是一个坏主意,因为这是生成无法维护的代码的一种东西。但是...事实证明,将任何一个预递增运算符转换为一个后递增运算符确实很容易。
我在Visual C++和Java中运行以下程序:
Visual C++
void main()
{
int i = 1, j;
j = i++ + i++ + ++i;
printf("%d\n",j);
}
Run Code Online (Sandbox Code Playgroud)
输出:
6
Run Code Online (Sandbox Code Playgroud)
Java的:
public class Increment {
public static void main(String[] args) {
int i = 1, j;
j = i++ + i++ + ++i;
System.out.println(j);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
7
Run Code Online (Sandbox Code Playgroud)
为什么这两种语言的输出不同?语言对于前后增量运算符的处理方式有何不同?
#include <stdio.h>
int main()
{
int a = 10;
if (a == a--)
printf("TRUE 1\t");
a = 10;
if (a == --a)
printf("TRUE 2\t");
}
Run Code Online (Sandbox Code Playgroud)
为什么第二个if语句是真的?
输出为:TRUE 1 TRUE 2
这是否由于未定义的行为而发生,因为我将相同的变量与其递减的值进行比较?
我们不能在rvalues上使用预增量:
int i = 0;
int j = ++i++; // Compile error: lvalue required
Run Code Online (Sandbox Code Playgroud)
如果我们定义一个类:
class A
{
public:
A & operator++()
{
return *this;
}
A operator++(int)
{
A temp(*this);
return temp;
}
};
Run Code Online (Sandbox Code Playgroud)
然后我们可以编译:
A i;
A j = ++i++;
Run Code Online (Sandbox Code Playgroud)
A对象和int数据类型之间有什么不同
j = ++i++;
Run Code Online (Sandbox Code Playgroud)
用A编译但不用int编译?
虽然这个问题可能在某处得到回答,但我找不到。
下面写的第一条语句有效而第二条语句无效?为什么?
int main() {
int x = 1, y = 2;
int *p = &++x; // First
std::cout << "*p = " << *p << std::endl;
// int *q = &x++; // Second
// std::cout << "*q = " << *p << std::endl;
}
Run Code Online (Sandbox Code Playgroud) c++ unary-operator pre-increment post-increment postfix-operator
我知道这里有一些关于 p++、++p 和 p+1 之间区别的解释,但我还不能清楚地理解它,尤其是当它不使用该函数时:
void replace(char * str, char c1, char c2){
if (*str == '\0') {
return;
}else if (*str == c1) {
printf("%c", c2);
}
else {
printf("%c", *str);
}
replace(++str, c1, c2);
}
Run Code Online (Sandbox Code Playgroud)
当我这样做replace(++str, c1, c2);或replace(str+1, c1, c2);它有效时,但replace(str++, c1, c2);没有。为什么?
post-increment ×10
c ×5
c++ ×5
java ×3
arrays ×1
c-strings ×1
increment ×1
operators ×1
overloading ×1
performance ×1
recursion ×1