〃忝書γě渎ぐ 发表于 2021-12-13 21:20:29

C++ 一个奇怪的问题

#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

执迷不悟0527 发表于 2021-12-13 21:55:43

额,不能问为什么吧!好像就是规定这样。

执迷不悟0527 发表于 2021-12-13 21:56:15

执迷不悟0527 发表于 2021-12-13 21:55
额,不能问为什么吧!好像就是规定这样。

我也是个新手,如果不对请指正 谢谢

sls111 发表于 2021-12-14 10:08:11

是不是默认编译器觉得你想--   ,猜的{:10_279:}

ljd884497 发表于 2021-12-14 11:54:00

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

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

傻眼貓咪 发表于 2021-12-14 20:54:09

因为系统不知道你的 -- 符是不是自减符,还是减负数?(建议如果运用加减算法,多加个括号,避免弄错)

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

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

代码:8 - - 5
而系统会把它看成: 8 + (- (-5))

傻眼貓咪 发表于 2021-12-14 21:43:45

人造人 发表于 2021-12-14 21:34
对于 8 -- 5
编译器是把这个理解成下面这样吧?
(8 --) 5


没错,抱歉,括号错边,应该是 (8--) 5 才对

人造人 发表于 2021-12-14 21:48:16

傻眼貓咪 发表于 2021-12-14 21:43
没错,抱歉,括号错边,应该是 (8--) 5 才对

没事,大家一起讨论遇到的问题,这才是论坛存在的意义

傻眼貓咪 发表于 2021-12-14 21:52:20

人造人 发表于 2021-12-14 21:48
没事,大家一起讨论遇到的问题,这才是论坛存在的意义

{:5_108:}
页: [1]
查看完整版本: C++ 一个奇怪的问题