回 帖 发 新 帖 刷新版面

主题:[讨论]&(++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值拷贝的存储方式不同。

措词不当的地方,望指正。也请各位发表下意见,学习下。。。

回复列表 (共8个回复)

沙发

从C++语法上看,没有错,前加加是个左值
从C语法上看,估计是错误的,没时间去查

板凳


多谢指点。。[em2][em2]

3 楼

测试结果确实如bruceteen所说。
在Visual Studio 2010中,把代码保存为.c格式,编译错误,提示“error C2102: '&' requires l-value”。把代码保存为.cpp格式,编译通过。
自从学习C++,很多时候都没有用纯粹的C去写代码,这些细节也就不甚了了了。我一直以为&(++a)是合法的。

4 楼


[em9][em9]多谢。。

5 楼

其实正确与否主要看++a返回的是什么(标准理解与编译器理解)++a如果返回的是a自身则此语法正确,而C应该是把++a的返回值当做“临时”值来处理的。

6 楼


那临时值存储在哪呢?

7 楼

[quote]
那临时值存储在哪呢?[/quote]由编译器决定:)标准里可不会规定这些东西:)

8 楼

[quote][quote]
那临时值存储在哪呢?[/quote]由编译器决定:)标准里可不会规定这些东西:)[/quote]
[em9][em9][em9]

我来回复

您尚未登录,请登录后再回复。点此登录或注册