【问题标题】:C constant expressions. const variables as constant expressionsC 常量表达式。 const 变量作为常量表达式
【发布时间】:2021-04-08 13:01:26
【问题描述】:

根据 6.6.10

10 一个实现可以接受其他形式的常量表达式。

实现可以考虑将const(或者甚至不考虑const,因为答案都集中在它上面——但这不是问题的核心)变量作为常量表达式。

我的逻辑正确吗?如果不是为什么?

一些例子:

//file scope

int a = 5;
const int b = 10;

int c[a];
int d[b];

IMO 均符合要求。它们可以评估编译时间。该值是已知的,静态数组的大小已知编译时间。

volatile int x = 5;  //cannot be considered as known compile time. ????
void foo(int a)
{
    static int b[a];
}

在此示例中,a 无法计算编译时间 - 因此它不能用作常量表达式

【问题讨论】:

  • @ryyker:问题不在于使用const 变量是否一定是C 中的常量,而是C 实现可能 是否接受const 变量作为给定问题中引用的许可证的常量。
  • @ryyker 它没有回答我的问题,而是离题
  • stackoverflow.com/questions/54135942/… 那里的答案会回答你的问题吗? :p 结论是“GCC 显然实现了一个扩展”,这意味着:Is my logic correct? 是的,甚至存在这样的实现。
  • @ryyker 如果很明显,我不会在这里问这个问题。您的引文(或更确切地说是答案之一)是 CE 的一种可能形式。但根据第 10 点,它不限于此,因为实施可能具有其他形式。这个答案没有回答我的问题。
  • @ryyker:关于“仅限于表示只读,不符合将其视为“其他形式”之一的资格”:这是一个不合逻辑的。某些东西是只读的这一事实并不意味着它被取消成为其他形式的资格。显然const 变量不在必须支持的核心常量表达式集中,所以它是另一种形式。

标签: c constants language-lawyer constant-expression


【解决方案1】:

常量表达式与const 限定符没有任何关系。整数常量表达式的定义见 6.6/6。

6.6/10 参考了同一章的前面部分,谈到整数常量表达式、初始化器中的常量表达式等。我相信引用的部分是指各种极端情况表达式,例如:

static int x;
static int y = (int)&x;

这不是严格遵守的,因为&x 不被视为一个整数常量表达式,而是一个地址常量。 gcc 和 clang 都不接受它。我相信 6.6/10 允许编译器支持像上面示例这样的代码作为实现定义的扩展。

【讨论】:

  • 6.6.6:“让懂的人来计算整数常量表达式。因为它是一个常量。它应该是整数类型,并且只能有整数常量的操作数。” :)
  • 它与我的问题有什么关系? 6.6.6 是一种可能的形式,但 p.10 也允许其他形式。 IMO 你没有回答我的问题。
  • @0___________ 他们列出了到 6.6 的各种形式的常量表达式,但也允许实现定义的,这是模糊的。这在整个标准中很常见,它们列出了各种允许的形式,然后以“或以某种实现定义的方式”结尾。然后指的是前面的部分,而不是完全不相关的东西。
  • const 正在引起混乱。我知道const 与常量表达式没有任何共同之处,问题不在于它。我了解到您对许多初学者关于为什么我的代码无法编译的问题感到困惑?
  • 查看我修改后的问题。也许例子可以解释我的意思
【解决方案2】:

以@ryyker 评论中的the link 为基础。

在 C 中,如果表达式完全由编译时常量(即文字)构成,则该表达式被视为常量。不接受const 变量,因为const 不一定表示“恒定”;它只是意味着从当前编译单元的角度来看,变量是不可变的(只读)。

考虑一个像这样的函数...

int add(const int a, const int b) {
    return a + b;

你可以通过传入编译时常量来调用这个函数,但你也可以传入可变变量。如果您传入一个变量,则出于该范围的目的,它被视为const(只读),但它的值在编译时仍然未知,因此它不是“常量”。

【讨论】:

  • ab 不符合 6.6.2 要求。示例不相关
  • 关于“如果表达式被认为是常量”:是的,“如果”,但不是“当且仅当”。 C 标准中的文本清楚地表明这不是“仅当”;还有其他可以接受的形式。这个答案没有说明const 变量是否可能是其中之一的问题。它无法回答问题。
  • @请注意。在 OP 指出链接(您所指的)没有解决问题的精神之后,在查看了一些 cmets 之后,我不得不同意。所以它已经被删除了。
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多