当前位置: 首页 > 知识库问答 >
问题:

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

顾炎彬
2023-03-14

考虑函数调用(调用< code>int sum(int,int))

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

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

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

共有3个答案

仲孙温文
2023-03-14

原因是C语法。虽然其他人似乎都喜欢引用这个例子,但真正的问题是标准(C99)中函数调用的短语结构语法。是的,函数调用由应用于后缀表达式的()运算符组成(例如标识符):

 6.5.2 postfix-expression:
       ...
       postfix-expression ( argument-expression-list_opt )

一起与

argument-expression-list:
       assignment-expression
       argument-expression-list , assignment-expression    <-- arglist comma

expression:
       assignment-expression
       expression , assignment-expression                  <-- comma operator

逗号运算符只能出现在表达式中,即语法中的下一级。因此,编译器将函数参数列表中的逗号视为分隔赋值表达式的逗号,而不是分隔表达式的逗号。

叶华皓
2023-03-14

来自C99 6.5.17:

如语法所示,逗号运算符(如本子条款所述)不能出现在使用逗号分隔列表中的项目的上下文中(例如函数的参数或初始值设定项列表)。另一方面,在这种上下文中,它可以在带圆括号的表达式中使用,也可以在条件运算符的第二个表达式中使用。在函数调用中

f(a, (t=3, t+2), c)

该函数有三个参数,第二个参数的值为5。

另一个类似的例子是数组或结构的初始化列表:

int array[5] = {1, 2};
struct Foo bar = {1, 2};

如果要将逗号运算符用作函数参数,请按如下方式使用它:

sum((a,b))

当然,这不会编译。

万俟小林
2023-03-14

看看C语言的语法。该标准的附录A中列出了全部内容。它的工作方式是,您可以逐步遍历C程序中的每个标记,并将它们与语法中的下一项相匹配。在每个步骤中,您只有有限的选项,因此任何给定字符的解释都将取决于它出现的上下文。在语法中的每个规则中,每一行都为程序提供了一个有效的选项来匹配。

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

这之所以有效,是因为参数列表规则谨慎使用赋值表达式规则,而不仅仅是普通的表达式规则。表达式可以包含逗号,而赋值表达式不能。如果不是这种情况,语法将是模棱两可的,当编译器遇到参数列表中的逗号时,它将不知道该怎么办。

但是,例如,不是函数定义/调用的一部分的左括号,或者< code>if、< code>while或< code>for语句,将被解释为表达式的一部分(因为没有其他选项,但只有当表达式的开始在该点是有效的选择时),然后,在括号内,将应用< code>expression语法规则,并且允许逗号运算符。

 类似资料:
  • C++ 运算符 使用逗号运算符的为了把几个表达式串在一起。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。从本质上讲,逗号的作用是导致一系列运算被顺序执行。 最右边的那个表达式的值将作为整个逗号表达式的值,其他表达式的值会被丢弃。例如: var = (count=19, incr=10, count+1); 在这里,首先把 count 赋值为 19,把 incr 赋值为 10,然后

  • 逗号运算符的目的是将几个表达式串起来。 以逗号分隔的表达式列表的值是最右侧表达式的值。 本质上,逗号的效果是导致执行一系列操作。 其他表达式的值将被丢弃。 这意味着右侧的表达式将成为整个逗号分隔表达式的值。 例如 - var = (count = 19, incr = 10, count+1); 这里首先指定计数值19,指定incr值10,然后将count加1,最后指定var最右边表达式的值,c

  • 本文向大家介绍浅谈JS中逗号运算符的用法,包括了浅谈JS中逗号运算符的用法的使用技巧和注意事项,需要的朋友参考一下 注意: 一、由于目前正在功读JavaScript技术,所以这里拿JavaScript为例。你可以自己在PHP中试试。 二、JavaScript语法比较复杂,因此拿JavaScript做举例。 最近重新阅读JavaScript权威指南这本书,应该说很认真的阅读,于是便想把所学的东西多记

  • 问题内容: 我已经看到了许多相关的问题,但是都没有直接解决我想做的事情。我正在从CSV文件中读取文本行。 所有项目都用引号引起来,有些则在引号内有其他逗号。我想按逗号分隔行,但忽略引号内的逗号。有没有一种方法可以在Python中执行此操作,而无需使用许多正则表达式语句。 一个例子是: 我想将其解析为4个单独的值变量: 我想念一个简单的选择吗? 问题答案: 不要尝试重新发明轮子。 如果要读取CSV文

  • CSV文件通常是如何生成的?用逗号还是分号?你有什么建议吗?