鱼C论坛

 找回密码
 立即注册
查看: 1108|回复: 9

[已解决]C++ 一个奇怪的问题

[复制链接]
发表于 2021-12-13 21:20:29 | 显示全部楼层 |阅读模式
20鱼币
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int i = -5*6--7;
    cout<<i<<endl;
        return 0;
}
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int i = -5*6- -7; //为什么改成这样就不报错,求原理。
    cout<<i<<endl;
        return 0;
}
最佳答案
2021-12-13 21:20:30
傻眼貓咪 发表于 2021-12-14 20:54
因为系统不知道你的 -- 符是不是自减符,还是减负数?(建议如果运用加减算法,多加个括号,避免弄错)

...


对于 8 -- 5
编译器是把这个理解成下面这样吧?
(8 --) 5

我去翻了一下运算符优先级表
后--优先级高于前--

我写了这样的代码测试
int main(int argc, char *argv[])
{
    int i = -5 * 6--7;
    int j = -5 * (6--)7;
    int k = -5 * 6(--7);
    return 0;
}
$ clang -g -Wall -o main main.c
main.c:4:19: error: expression is not assignable
    int i = -5 * 6--7;
                 ~^
main.c:4:21: error: expected ';' at end of declaration
    int i = -5 * 6--7;
                    ^
                    ;
main.c:5:20: error: expression is not assignable
    int j = -5 * (6--)7;
                  ~^
main.c:5:23: error: expected ';' at end of declaration
    int j = -5 * (6--)7;
                      ^
                      ;
main.c:6:20: error: expression is not assignable
    int k = -5 * 6(--7);
                   ^ ~
5 errors generated.

关键是这两个
    int i = -5 * 6--7;
                 ~^
    int j = -5 * (6--)7;
                  ~^
~^这两个符号标的位置是一样的
这个标在了后面
    int k = -5 * 6(--7);
                   ^ ~

所以,我感觉应该把 8 -- 5
理解成这样?
(8 --) 5

最佳答案

查看完整内容

对于 8 -- 5 编译器是把这个理解成下面这样吧? (8 --) 5 我去翻了一下运算符优先级表 后--优先级高于前-- 我写了这样的代码测试 关键是这两个 ~^这两个符号标的位置是一样的 这个标在了后面 所以,我感觉应该把 8 -- 5 理解成这样? (8 --) 5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-13 21:20:30 | 显示全部楼层    本楼为最佳答案   
傻眼貓咪 发表于 2021-12-14 20:54
因为系统不知道你的 -- 符是不是自减符,还是减负数?(建议如果运用加减算法,多加个括号,避免弄错)

...


对于 8 -- 5
编译器是把这个理解成下面这样吧?
(8 --) 5

我去翻了一下运算符优先级表
后--优先级高于前--

我写了这样的代码测试
int main(int argc, char *argv[])
{
    int i = -5 * 6--7;
    int j = -5 * (6--)7;
    int k = -5 * 6(--7);
    return 0;
}
$ clang -g -Wall -o main main.c
main.c:4:19: error: expression is not assignable
    int i = -5 * 6--7;
                 ~^
main.c:4:21: error: expected ';' at end of declaration
    int i = -5 * 6--7;
                    ^
                    ;
main.c:5:20: error: expression is not assignable
    int j = -5 * (6--)7;
                  ~^
main.c:5:23: error: expected ';' at end of declaration
    int j = -5 * (6--)7;
                      ^
                      ;
main.c:6:20: error: expression is not assignable
    int k = -5 * 6(--7);
                   ^ ~
5 errors generated.

关键是这两个
    int i = -5 * 6--7;
                 ~^
    int j = -5 * (6--)7;
                  ~^
~^这两个符号标的位置是一样的
这个标在了后面
    int k = -5 * 6(--7);
                   ^ ~

所以,我感觉应该把 8 -- 5
理解成这样?
(8 --) 5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-13 21:55:43 | 显示全部楼层
额,不能问为什么吧!好像就是规定这样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-13 21:56:15 | 显示全部楼层
执迷不悟0527 发表于 2021-12-13 21:55
额,不能问为什么吧!好像就是规定这样。

我也是个新手,如果不对请指正 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-14 10:08:11 | 显示全部楼层
是不是默认编译器觉得你想  --   ,猜的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-14 11:54:00 | 显示全部楼层
这个编译器读取操作符的方法有关,一般编译器读取操作符采用“贪心法”
就你这个表达式来讲:
(第一次报错的表达式)-5*6--7
编译器从第一上‘-’符号开始读入,当只读入第一个‘-’符号时,它并不把这个符号当成人类认为操作符‘负’号,它要接着读入第2个符号(就是这个‘5’),这时它才发现前一个读入的‘-’符号可以表示为操作符'负'号。
同理,编译器在读入字符‘6’这后,它开始第读入第一个‘-’,这时它还是不能判定这个符号能不能当做操作符,它会继续读入下一个符号(就是‘6’之后的第2个‘-’),这是就组成‘--’,但编译器还是不能判定这两个符号能不能组成一个有效的操作符(因为它“贪心”)所以它接着往后读入下个符号(就是'7'),这时它才判定前2个读入的符号能组成有效的操作符(就是自减操作符)。自减操作符是对前面的符号'6'进行操作,所以后面这个符号'7'就成了“孤儿”了,整个表达式成了非法(多出一个孤零零的’7‘),所以就报错了。

第2个表达式(正确那一个)-5*6- -7
同样分析,读入6后面那个'-'符号后,编译器会继续读入下个符号(下一个符号是' '空号),这时它再判定前一个'-'为操作符’减号‘,而后的那个'-'符号会被定为'负'号操作符。所以整个表达式是正确的。

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
〃忝書γě渎ぐ + 2 + 2 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

发表于 2021-12-14 20:54:09 | 显示全部楼层
因为系统不知道你的 -- 符是不是自减符,还是减负数?(建议如果运用加减算法,多加个括号,避免弄错)

这是有关汇编知识(补码)
代码:8 - 5
而系统会把它看成: 8 + (-5)

代码:8 -- 5
而系统会把它看成: 8 (--5)  这里会报错,语法错误

代码:8 - - 5
而系统会把它看成: 8 + (- (-5))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-14 21:43:45 | 显示全部楼层
人造人 发表于 2021-12-14 21:34
对于 8 -- 5
编译器是把这个理解成下面这样吧?
(8 --) 5

没错,抱歉,括号错边,应该是 (8--) 5 才对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-14 21:48:16 | 显示全部楼层
傻眼貓咪 发表于 2021-12-14 21:43
没错,抱歉,括号错边,应该是 (8--) 5 才对

没事,大家一起讨论遇到的问题,这才是论坛存在的意义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-14 21:52:20 | 显示全部楼层
人造人 发表于 2021-12-14 21:48
没事,大家一起讨论遇到的问题,这才是论坛存在的意义

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 07:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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