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