wow7jiao 发表于 2018-7-3 21:56:40

请老师指点一下。指针是不是左值

void *p;
++(int *)p;


翻译不能通过 显示指针p不是左值

人造人 发表于 2018-7-3 21:56:41

我没有能力去翻那些英文文档,我百度不到满意的结果,我自己测试了一下,得出了下面的答案

如果一个”对象”可以出现在等于号的左边,这个对象就可以使用加加减减运算符(++,--)
#include <stdio.h>

int main(void)
{
        int a = 0;

        a = 100;
        a++;

        return 0;
}


因为 a = 100;
变量a出现在了等于号的左边,所以a可以使用++运算符
所以a++;是正确的


#include <stdio.h>

int main(void)
{
        int a = 0;
        int b = 0;
        int c = 0;

        c = (a + b);
        (a + b) = c;
        (a + b)++;


        return 0;
}


(a + b) 只能出现在等于号的右边,所以(a + b)++;是错误的



#include <stdio.h>

int main(void)
{
        int a = 0;
        void *p = &a;

        (int *)p = 0;

        return 0;
}


vs下可以通过编译,gcc下无法通过编译


#include <stdio.h>

int main(void)
{
        int a = 0;
        int b = 0;
        void *p = &a;

        (int *)p = 0;
        (a + b)++;

        return 0;
}


C:\VisualStudioProjects\C\C>gcc main.c
main.c: In function 'main':
main.c:9:11: error: lvalue required as left operand of assignment
(int *)p = 0;
         ^
main.c:10:9: error: lvalue required as increment operand
(a + b)++;

也就是说gcc把(int *)p当成是只能出现在等于号右边的“对象”,和(a + b)一样只能出现在等于号右边,所以(int *)p不能使用++,--运算符


我得出的结论,没有去翻那些官方资料^_^
如果一个”对象”可以出现在等于号的左边,这个对象就可以使用++,--运算符

wow7jiao 发表于 2018-7-3 22:01:15

这是截图

ba21 发表于 2018-7-3 22:31:46

这个vc6 这样是可以的。
你尝试加个()看看
++((int *)p);

而且我发现你的()和;都是中文,你确定是复制过来的,还是重新打上去的?

wow7jiao 发表于 2018-7-3 22:43:42

ba21 发表于 2018-7-3 22:31
这个vc6 这样是可以的。
你尝试加个()看看
++((int *)p);


我加了括号还是通不过

wow7jiao 发表于 2018-7-3 22:46:06

截图在这里,一楼的代码不是复制过来的,是打的时候时候忘记调整输入法

ba21 发表于 2018-7-3 23:22:11

wow7jiao 发表于 2018-7-3 22:46
截图在这里,一楼的代码不是复制过来的,是打的时候时候忘记调整输入法

刚刚用vs 调式了下,得知
如下错误:
“void *”: 未知的大小

很明确了,原因是 不知道 void 的大小,所以无法实现自增。所以前提得先知道大小(这也是各编译器之前的区别) 如:
        void *p1;

        int *p2;

        p2 = (int *)p1;
        ++p2; // 只能对已知 大小 的数据类型进行自增vs中 (int *)p1

人造人 发表于 2018-7-3 23:23:20




我的是.c,你的是.cpp
页: [1]
查看完整版本: 请老师指点一下。指针是不是左值