gpt4 book ai didi

c - 编译器如何知道函数调用中的逗号不是逗号运算符?

转载 作者:太空狗 更新时间:2023-10-29 16:20:41 24 4
gpt4 key购买 nike

考虑函数调用(调用int sum(int, int))

printf("%d", sum(a,b));

编译器如何确定函数调用sum(int, int) 中使用的, 不是逗号运算符?

注意:我不想在函数调用中实际使用逗号运算符。我只是想知道编译器如何知道它不是逗号运算符。

最佳答案

看看C语言的语法。它完整​​地列在 standard 的附录 A 中。 .它的工作方式是您可以单步执行 C 程序中的每个标记,并将它们与语法中的下一项匹配。在每个步骤中,您只有有限数量的选项,因此对任何给定字符的解释将取决于它出现的上下文。在语法的每条规则中,每一行都给出了程序匹配的有效替代方案。

具体来说,如果您查找 parameter-list,您会看到它包含一个明确的逗号。因此,只要编译器的 C 解析器处于“参数列表”模式,它找到的逗号将被理解为参数分隔符,而不是逗号运算符。括号也是如此(也可以出现在表达式中)。

这是有效的,因为 parameter-list 规则谨慎地使用 assignment-expression 规则,而不仅仅是普通的 expression 规则。 expression 可以包含逗号,而 assignment-expression 不能。如果不是这种情况,语法就会有歧义,编译器在遇到参数列表中的逗号时将不知道该怎么办。

但是,例如,左括号不是函数定义/调用的一部分,或者 ifwhile、或 for 语句,将被解释为表达式的一部分(因为没有其他选项,但前提是此时表达式的开头是有效选择),然后在括号内, expression 语法规则将适用,并且允许逗号运算符。

关于c - 编译器如何知道函数调用中的逗号不是逗号运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17383492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com