主题:[讨论]&(++a)的问题
偶然在CSDN上看到这么个问题。第一次发帖, 欢迎大家讨论。。
原帖如下:
[code=c]
int main()
{
int a=0;
int b=1;
//int c = ++(++a)+b;
//printf( "%d\n ",c);
int *p = &(++a);
return 0;
}
编译提示错误: error C2102: “&”要求左值
[/code]
我将问题转化了下,是这样的:
[code=c]
#include <stdio.h>
int main(int argc, char *argv[])
{
int a=0;
int b=1;
int *p = NULL;
printf("&a = %p",&a);
p = &(++a);
printf("&(++a) = %p\n", p);
return 0;
}
[/code]
VC编译通过,运行结果:&a = M, &(++a) = M;(M为一个值)
C-Free编译不通过。。
看了lx几位的回帖,我.....
看到回帖,VS编译无问题,当然我没装,不知道。VC编译无问题,有点意外,于是我看了下生成的汇编代码(ps:只是稍微了解几个指令),关键部分贴上来。
[code=c]
p = &(++a);
---------------------------------------------
mov ecx, DWORD PTR _a$[ebp]
add ecx, 1
mov DWORD PTR _a$[ebp], ecx
lea edx, DWORD PTR _a$[ebp]
mov DWORD PTR _p$[ebp], edx
---------------------------------------------
[/code]
根据这段代码,运行结果也能理解了。
但是既然有的编译器报错了(用C-Free5.0就如此,但我不熟悉调试),显示错误和他的错误提示一样的。 我只能推测是否 ++a实现不同,即对a值拷贝的存储方式不同。
措词不当的地方,望指正。也请各位发表下意见,学习下。。。
原帖如下:
[code=c]
int main()
{
int a=0;
int b=1;
//int c = ++(++a)+b;
//printf( "%d\n ",c);
int *p = &(++a);
return 0;
}
编译提示错误: error C2102: “&”要求左值
[/code]
我将问题转化了下,是这样的:
[code=c]
#include <stdio.h>
int main(int argc, char *argv[])
{
int a=0;
int b=1;
int *p = NULL;
printf("&a = %p",&a);
p = &(++a);
printf("&(++a) = %p\n", p);
return 0;
}
[/code]
VC编译通过,运行结果:&a = M, &(++a) = M;(M为一个值)
C-Free编译不通过。。
看了lx几位的回帖,我.....
看到回帖,VS编译无问题,当然我没装,不知道。VC编译无问题,有点意外,于是我看了下生成的汇编代码(ps:只是稍微了解几个指令),关键部分贴上来。
[code=c]
p = &(++a);
---------------------------------------------
mov ecx, DWORD PTR _a$[ebp]
add ecx, 1
mov DWORD PTR _a$[ebp], ecx
lea edx, DWORD PTR _a$[ebp]
mov DWORD PTR _p$[ebp], edx
---------------------------------------------
[/code]
根据这段代码,运行结果也能理解了。
但是既然有的编译器报错了(用C-Free5.0就如此,但我不熟悉调试),显示错误和他的错误提示一样的。 我只能推测是否 ++a实现不同,即对a值拷贝的存储方式不同。
措词不当的地方,望指正。也请各位发表下意见,学习下。。。