为什么赢了';在GCC中编译带有4个破折号的合法C代码?

为什么赢了';在GCC中编译带有4个破折号的合法C代码?,c,C,这是合法的C代码 INT m = -3; INT t = ----m; 减量(-)正m(-m)和负(-) (-)-m 但无法编译,错误为:递减操作数需要左值 有人知道为什么这个不能编译吗?你不能编译--(-m)也不能编译--(-m),因为在这两种情况下,--的参数都不能写入。没有地方写回--的值,除非它的直接参数是变量或取消引用的指针-根本不起作用,因为它现在是临时的 pre/post递增/递减运算符的输出同样不是可以写入的内容(post上可以立即看到这一点,但pre上也是如此) 注意C不是回

这是合法的C代码

INT m = -3;
INT t = ----m;
减量(-)正m(-m)和负(-)

(-)-m

但无法编译,错误为:递减操作数需要左值 有人知道为什么这个不能编译吗?

你不能编译
--(-m)
也不能编译
--(-m)
,因为在这两种情况下,
--
的参数都不能写入。没有地方写回
--
的值,除非它的直接参数是变量或取消引用的指针<代码>-根本不起作用,因为它现在是临时的

pre/post递增/递减运算符的输出同样不是可以写入的内容(post上可以立即看到这一点,但pre上也是如此)

注意C不是回溯语言*;因此,它不会单独找到
-((-m))
的唯一合法解析。在我按预期在
--m
中添加空格后,它确实找到了它

*用过一个,你就不想要了。结果令人惊讶。

您无法编译
--(-m)
--(-m)
,因为在这两种情况下,
--
的参数都不能写入。没有地方写回
--
的值,除非它的直接参数是变量或取消引用的指针<代码>-根本不起作用,因为它现在是临时的

pre/post递增/递减运算符的输出同样不是可以写入的内容(post上可以立即看到这一点,但pre上也是如此)

注意C不是回溯语言*;因此,它不会单独找到
-((-m))
的唯一合法解析。在我按预期在
--m
中添加空格后,它确实找到了它

*用过一个,你就不想要了。结果令人惊讶。

--m
不是
-
-
-
m

--m
--
--
m
,因为编译器总是找到最长的标记

编译器告诉您,
-
-
m
是非法构造。

--m
不是
-
-
-
m

--m
--
--
m
,因为编译器总是找到最长的标记


编译器告诉您,
--
--
m
是非法构造。

它不是合法的C代码。正如编译器告诉你的(甚至是一种善意的告诉你为什么)编译是什么?“这是合法的C代码”不,它恰巧是合法的C++代码,但是这是一种不同的语言,它解析为<代码> -----(-m)< /code >无论如何……<代码> int <代码>定义在哪里?你是说
int
?(因为你问的是C语法的微妙方面,精确到令人痛苦的程度是值得的。)
int
是一个关键字和内置类型的名称
INT
是非标准的。如果您要在这里发布的代码中使用它,请告诉我们它是如何定义的。或者只使用
int
,如果不是更好的话,也可以说明这个问题。这不是合法的C代码。正如编译器告诉你的(甚至是一种善意的告诉你为什么)编译是什么?“这是合法的C代码”不,它恰巧是合法的C++代码,但是这是一种不同的语言,它解析为<代码> -----(-m)< /code >无论如何……<代码> int <代码>定义在哪里?你是说
int
?(因为你问的是C语法的微妙方面,精确到令人痛苦的程度是值得的。)
int
是一个关键字和内置类型的名称
INT
是非标准的。如果您要在这里发布的代码中使用它,请告诉我们它是如何定义的。或者只使用
int
,如果不是更好的话,也可以说明这个问题。
--m
是一个合法的解析,但有一个语义错误。(左值是一种语义属性,而不是语法的一部分)。因此,即使它确实沿着你建议的路线回溯,它也永远不会得出结论。
--m
@m.m:我很确定你知道我的意思。我使用了一种定义为以非常类似的方式回溯的语言(语义反馈到语法中),直到它生成了一个有效的程序。
--m
是一种合法的解析,但有一个语义错误。(左值是一种语义属性,而不是语法的一部分)。因此,即使它确实沿着你建议的路线回溯,它也永远不会得出结论。
--m
@m.m:我很确定你知道我的意思。我使用了一种定义为以非常类似的方式回溯(语义反馈到语法中)的语言,直到它生成了一个有效的程序。