C 在函数调用中,什么是运算符,什么是操作数?
我试图理解C语言的一些基础知识 函数调用是一个后缀表达式,称为函数指示符,后跟括号,括号中可能包含空的、逗号分隔的赋值表达式列表(第A7.17段), 构成函数的参数C 在函数调用中,什么是运算符,什么是操作数?,c,language-lawyer,kernighan-and-ritchie,function-call-operator,C,Language Lawyer,Kernighan And Ritchie,Function Call Operator,我试图理解C语言的一些基础知识 函数调用是一个后缀表达式,称为函数指示符,后跟括号,括号中可能包含空的、逗号分隔的赋值表达式列表(第A7.17段), 构成函数的参数 在函数调用中,什么是运算符,什么是操作数 ()是操作员吗 函数名是操作数吗 参数是否在操作数中 函数指示符是函数调用的同义词吗 谢谢。在函数调用中,()是运算符,就像访问数组元素时,[]是运算符一样 6.5.2后缀运算符 此运算符的操作数是函数名(或指向函数的指针) 参数是否在操作数中 否。根据C标准,表达式列表指定函数的参数。C标
()
是操作员吗
函数名是操作数吗
参数是否在操作数中()
是运算符,就像访问数组元素时,[]
是运算符一样
6.5.2后缀运算符
此运算符的操作数是函数名(或指向函数的指针)
参数是否在操作数中
否。根据C标准,表达式列表指定函数的参数。C标准中的文本几乎相同,6.5.2.2: 后跟括号()的后缀表达式,其中可能包含 空的、逗号分隔的表达式列表是一个函数调用。这个 后缀表达式表示被调用的函数。名单 表达式指定函数的参数 语法为(6.5.2): 这意味着函数名是一个“后缀表达式”,而
()
是实际的运算符。C标准没有提到这个操作符的操作数,但我想你可以把函数名称为操作数。参数列表不是操作数,而是一种特殊情况
功能指示器的定义为(6.3.2.1): 函数指示符是具有函数类型的表达式 表达式
func()中的含义
,func
将是函数指示符,但整个表达式将是函数调用。所以它不是完全相同的术语
考虑示例
funcptr\u t f=func
包含函数指示符func
但没有函数调用。函数调用在黄色框中定义,显然不是函数指示符,它是函数名。顺便说一句,知道这些东西对任何不编写编译器的人来说都是毫无用处的。我想你可以把函数名称为操作数。这不是常见的做法:函数调用上下文中的“操作数”一词通常指定参数列表中的每个表达式,即参数的同义词。C标准对此不使用操作数,也不使用宏参数或参数,但其他编程语言(如Python)的规范使用操作数。@chqrlie因此出现了“我想”:)我确实强调,在这种情况下,标准没有提到任何操作数。注§6.5.2.2?1说:表示被调用函数的表达式(92)应具有类型指针,指向返回void或返回数组类型以外的完整对象类型的函数。脚注92说:通常,这是转换作为函数指示符的标识符的结果。§6.3.2.1继续:除非它是sizeof运算符(65)或一元&运算符的操作数,否则类型为“函数返回类型”的函数指示符将转换为类型为“指向函数返回类型的指针”的表达式“@JonathanLeffler:毫无疑问,函数指示符可以用作某些运算符的操作数,这并不意味着它是函数调用运算符的操作数,函数调用运算符也不是这样指定的。形式语法定义绝对是初学者最需要的:)操作数本质上是参数的同义词@彼得,也许吧,但OP有23K的代表,几乎不是初学者。
Syntax
1 postfix-expression:
primary-expression
postfix-expression [ expression ]
postfix-expression ( argument-expression-listopt )
postfix-expression . identifier
postfix-expression -> identifier
postfix-expression ++
postfix-expression --
( type-name ) { initializer-list }
( type-name ) { initializer-list , }
argument-expression-list:
assignment-expression
argument-expression-list , assignment-expression
postfix-expression ( argument-expression-listopt )