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-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
额,不能问为什么吧!好像就是规定这样。
我也是个新手,如果不对请指正 谢谢 是不是默认编译器觉得你想-- ,猜的{:10_279:} 这个编译器读取操作符的方法有关,一般编译器读取操作符采用“贪心法”
就你这个表达式来讲:
(第一次报错的表达式)-5*6--7
编译器从第一上‘-’符号开始读入,当只读入第一个‘-’符号时,它并不把这个符号当成人类认为操作符‘负’号,它要接着读入第2个符号(就是这个‘5’),这时它才发现前一个读入的‘-’符号可以表示为操作符'负'号。
同理,编译器在读入字符‘6’这后,它开始第读入第一个‘-’,这时它还是不能判定这个符号能不能当做操作符,它会继续读入下一个符号(就是‘6’之后的第2个‘-’),这是就组成‘--’,但编译器还是不能判定这两个符号能不能组成一个有效的操作符(因为它“贪心”)所以它接着往后读入下个符号(就是'7'),这时它才判定前2个读入的符号能组成有效的操作符(就是自减操作符)。自减操作符是对前面的符号'6'进行操作,所以后面这个符号'7'就成了“孤儿”了,整个表达式成了非法(多出一个孤零零的’7‘),所以就报错了。
第2个表达式(正确那一个)-5*6- -7
同样分析,读入6后面那个'-'符号后,编译器会继续读入下个符号(下一个符号是' '空号),这时它再判定前一个'-'为操作符’减号‘,而后的那个'-'符号会被定为'负'号操作符。所以整个表达式是正确的。
因为系统不知道你的 -- 符是不是自减符,还是减负数?(建议如果运用加减算法,多加个括号,避免弄错)
这是有关汇编知识(补码)
代码:8 - 5
而系统会把它看成: 8 + (-5)
代码:8 -- 5
而系统会把它看成: 8 (--5)这里会报错,语法错误
代码:8 - - 5
而系统会把它看成: 8 + (- (-5)) 人造人 发表于 2021-12-14 21:34
对于 8 -- 5
编译器是把这个理解成下面这样吧?
(8 --) 5
没错,抱歉,括号错边,应该是 (8--) 5 才对 傻眼貓咪 发表于 2021-12-14 21:43
没错,抱歉,括号错边,应该是 (8--) 5 才对
没事,大家一起讨论遇到的问题,这才是论坛存在的意义
人造人 发表于 2021-12-14 21:48
没事,大家一起讨论遇到的问题,这才是论坛存在的意义
{:5_108:}
页:
[1]