我一直在愚弄一些代码,看到一些我不理解"为什么"的东西.
int i = 6;
int j;
int *ptr = &i;
int *ptr1 = &j
j = i++;
//now j == 6 and i == 7. Straightforward.
Run Code Online (Sandbox Code Playgroud)
如果您将操作员放在等号的左侧怎么办?
++ptr = ptr1;
Run Code Online (Sandbox Code Playgroud)
相当于
(ptr = ptr + 1) = ptr1;
Run Code Online (Sandbox Code Playgroud)
而
ptr++ = ptr1;
Run Code Online (Sandbox Code Playgroud)
相当于
ptr = ptr + 1 = ptr1;
Run Code Online (Sandbox Code Playgroud)
后缀运行编译错误,我得到它.你在赋值运算符的左侧有一个常量"ptr + 1".很公平.
一个编译的前缀和C++中的WORKS.是的,我理解它很乱,你正在处理未分配的内存,但它可以工作和编译.在C中,这不会编译,返回与后缀"左值作为赋值的左操作数所需的左值"相同的错误.无论如何编写,使用两个"="运算符或"++ ptr"语法扩展,都会发生这种情况.
C如何处理这样的赋值和C++如何处理它有什么区别?
测试.(C/CPP)
#include <stdio.h>
int main(int argc, char** argv)
{
int a = 0, b = 0;
printf("a = %d, b = %d\n", a, b);
b = (++a)--;
printf("a = %d, b = %d\n", a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我将上面的内容保存为.cpp文件,它会在执行时编译并输出:
a = 0, b = 0
a = 0, b = 1
Run Code Online (Sandbox Code Playgroud)
但是,如果我将其保存为.c文件,我会收到以下错误:
test.c:7:12: error: lvalue required as decrement operator.
Run Code Online (Sandbox Code Playgroud)
(++a)手术前不应该解决(newValue)--手术吗?有没有人对此有任何见解?