鱼C论坛

 找回密码
 立即注册
查看: 2142|回复: 7

[已解决]请老师指点一下。指针是不是左值

[复制链接]
发表于 2018-7-3 21:56:40 | 显示全部楼层 |阅读模式
10鱼币
void *p;
++(int *)p;


翻译不能通过 显示指针p不是左值
最佳答案
2018-7-3 21:56:41
我没有能力去翻那些英文文档,我百度不到满意的结果,我自己测试了一下,得出了下面的答案

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

  2. int main(void)
  3. {
  4.         int a = 0;

  5.         a = 100;
  6.         a++;

  7.         return 0;
  8. }
复制代码


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


  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int a = 0;
  5.         int b = 0;
  6.         int c = 0;

  7.         c = (a + b);
  8.         (a + b) = c;
  9.         (a + b)++;


  10.         return 0;
  11. }
复制代码


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



  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int a = 0;
  5.         void *p = &a;

  6.         (int *)p = 0;

  7.         return 0;
  8. }
复制代码


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


  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int a = 0;
  5.         int b = 0;
  6.         void *p = &a;

  7.         (int *)p = 0;
  8.         (a + b)++;

  9.         return 0;
  10. }
复制代码

  1. C:\VisualStudioProjects\C\C>gcc main.c
  2. main.c: In function 'main':
  3. main.c:9:11: error: lvalue required as left operand of assignment
  4.   (int *)p = 0;
  5.            ^
  6. main.c:10:9: error: lvalue required as increment operand
  7.   (a + b)++;
复制代码


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


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

最佳答案

查看完整内容

我没有能力去翻那些英文文档,我百度不到满意的结果,我自己测试了一下,得出了下面的答案 如果一个”对象”可以出现在等于号的左边,这个对象就可以使用加加减减运算符(++,--) 因为 a = 100; 变量a出现在了等于号的左边,所以a可以使用++运算符 所以a++;是正确的 (a + b) 只能出现在等于号的右边,所以(a + b)++;是错误的 vs下可以通过编译,gcc下无法通过编译 也就是说gcc把(int ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-3 21:56:41 | 显示全部楼层    本楼为最佳答案   
我没有能力去翻那些英文文档,我百度不到满意的结果,我自己测试了一下,得出了下面的答案

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

  2. int main(void)
  3. {
  4.         int a = 0;

  5.         a = 100;
  6.         a++;

  7.         return 0;
  8. }
复制代码


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


  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int a = 0;
  5.         int b = 0;
  6.         int c = 0;

  7.         c = (a + b);
  8.         (a + b) = c;
  9.         (a + b)++;


  10.         return 0;
  11. }
复制代码


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



  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int a = 0;
  5.         void *p = &a;

  6.         (int *)p = 0;

  7.         return 0;
  8. }
复制代码


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


  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int a = 0;
  5.         int b = 0;
  6.         void *p = &a;

  7.         (int *)p = 0;
  8.         (a + b)++;

  9.         return 0;
  10. }
复制代码

  1. C:\VisualStudioProjects\C\C>gcc main.c
  2. main.c: In function 'main':
  3. main.c:9:11: error: lvalue required as left operand of assignment
  4.   (int *)p = 0;
  5.            ^
  6. main.c:10:9: error: lvalue required as increment operand
  7.   (a + b)++;
复制代码


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


我得出的结论,没有去翻那些官方资料^_^
如果一个”对象”可以出现在等于号的左边,这个对象就可以使用++,--运算符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-3 22:01:15 | 显示全部楼层
这是截图
QQ截图20180703220041.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-3 22:31:46 | 显示全部楼层
这个vc6 这样是可以的。
你尝试加个()看看
++((int *)p);

而且我发现你的()和;都是中文,你确定是复制过来的,还是重新打上去的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-3 22:43:42 | 显示全部楼层
ba21 发表于 2018-7-3 22:31
这个vc6 这样是可以的。
你尝试加个()看看
++((int *)p);

我加了括号还是通不过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-3 22:46:06 | 显示全部楼层
截图在这里,一楼的代码不是复制过来的,是打的时候时候忘记调整输入法
QQ截图20180703224259.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
wow7jiao + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-3 23:23:20 | 显示全部楼层
1.png
2.png

我的是.c,你的是.cpp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 12:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表