给定int *foo(void),求表达式类型及左值判定的技术咨询
函数表达式的类型与左值判断分析
给定函数声明:int *foo(void),即foo是一个无参数、返回**指向int的指针(int*)**的函数。以下逐个分析各表达式的类型、合法性及左值属性:
1. *foo()
- 类型:
int
逻辑:foo()调用后返回int*类型的值,对该指针执行解引用操作(*),得到指针指向的对象类型,即int。 - 左值属性:是左值
逻辑:只要foo()返回的指针指向有效可修改对象(比如全局变量、堆内存指针),*foo()就代表该对象本身,可被赋值(例如*foo() = 10;合法),符合左值定义(能出现在赋值运算符左侧)。
2. &foo()
- 合法性:编译错误,表达式不合法
逻辑:foo()是函数调用表达式,返回值是int*类型的右值(临时值,无持久内存地址)。取地址运算符&的操作数必须是左值、函数指示符或数组类型等,不能作用于右值,因此该表达式无法通过编译,不存在类型和左值属性。
3. foo()
- 类型:
int*
逻辑:直接调用foo,返回值类型与函数声明的返回类型一致,即指向int的指针。 - 左值属性:非左值
逻辑:函数调用返回的指针是临时右值,无法被赋值(例如foo() = &x;非法),不能出现在赋值运算符左侧。
4. foo
- 类型:
int* (*)(void)(指向无参数、返回int*的函数的指针)
逻辑:在表达式中,函数指示符foo会隐式转换为指向该函数的指针(作为sizeof或&的操作数时除外)。 - 左值属性:非左值(转换后的指针是右值)
逻辑:转换后的函数指针是临时值,无法被赋值(例如foo = &another_func;非法,函数名是常量标识符)。
5. &foo
- 类型:
int* (*)(void)(与foo转换后的类型一致)
逻辑:取函数foo的地址,结果为指向该函数的指针,类型即函数指针类型。 - 左值属性:非左值
逻辑:函数指针值是右值,无法被赋值,不能出现在赋值运算符左侧。
内容的提问来源于stack exchange,提问作者malloc
相关产品推荐
相关产品推荐

