以下隐式限定转换的示例在 C 中合理吗?

问题描述 投票:0回答:1

前几天提出的问题没有说清楚。现在,我将尝试用最简短的语言提出这个问题。 直接看这里的例子,或者直接看我截取的关键片段:

指向非常量类型的指针可以隐式转换为指向相同或兼容类型的 const 限定版本的指针:

int* p = 0;
const int* cp = p; // OK: adds qualifiers (int to const int)

我的观点是这个例子有一点问题。 (我的观点可能不正确。) 接下来详细介绍一下我的理解(同样也可能不正确):

我们首先看一下浮点数到整数的转换,并给出一个完美的例子 (浮点数到整数的隐式转换需要依赖其他隐式转换,因为浮点数不可能出现在任何地方并立即隐式转换为整数。这是荒谬的。

因此,我们可以依靠这样的隐式转换,在简单赋值(=)中,右操作数的值被转换为赋值表达式的类型(C11 6.5.16.1 p2):)

int n=3.14; //double to int

因为这里存在简单赋值需要的隐式转换,所以发生了浮点数到整数的隐式转换。(虽然这是初始化,但根据我所学的知识,我只能认为由于 简单赋值而发生了隐式转换。)

隐式限定转换也是一样。但是需要注意的是,“赋值表达式的类型是左操作数左值转换后的类型。(6.5.16 p3)”同时,这一点在评估作业的约束时已经提到: —左操作数具有原子、限定或非限定指针类型,并且(考虑 左值转换后左操作数的类型)两个操作数都是 指向兼容类型的限定或非限定版本的指针···(6.5.16.1 约束 p1)

那么在第一个示例中,

p
的类型为
int*
,这是正确的。但赋值表达式的类型也应该是
int*
而不是
const int*
(虚左值转换后),那么为什么第一个例子可以作为隐式限定转换的例子呢?

那么,我的问题是,我上面的分析正确吗?如果正确,请给出一个符合隐式限定转换的完美示例。如有错误,请详细指出。

感谢您阅读它。说实话,我不自信自己是对的。我很乐意您指出我的错误。

https://en.cppreference.com/w/c/language/const

c c11
1个回答
0
投票

我的观点是,这个例子有点问题……但是赋值表达式的类型也应该是

int*
而不是
const int*
(虚左值转换之后),那为什么可以用第一个例子作为隐式限定转换的示例?

这是不正确的。左值转换会将

const
限定类型(如
const int
)转换为非限定类型(如
int
)。但是,
const int *
不是合格类型。它是一个没有任何限定条件的指针;指针不是
const
。指针指向另一种类型。这种类型是
const int

左值转换不会删除指向类型中的限定符。

int * const
是指向
const
int
限定指针,左值转换会将其转换为
int *

const int * const
是指向
const
const int
限定指针,左值转换会将其转换为
const int *

const int *
是指向
const int
的非限定指针,左值转换会将其转换为
const int *

© www.soinside.com 2019 - 2024. All rights reserved.