问题标签 [constant-expression]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
722 浏览

python - 带标签的 Python 常量折叠

我想做一些类似于使用 Python 进行常量折叠的事情。

Python 有一个方便的内置函数 eval(),因此可以通过应用 eval() 轻松折叠只有常量的方程。

例子:

但是,我想实现的常量折叠应该处理非常量标签。

例子:

如果常量部分由标签分隔,例如 (s = '2 + _tbl + 4'),它仍应生成 '_tbl + 6' (或 '6 + _tbl)。

几年前,我使用“C”编写了一个常量折叠例程。这不是一个小例程,因为我需要构建一棵树并评估运算符的优先级。

由于 Python 语言比“C”强大得多,所以在使用 Python 做同样的事情之前,我想寻求其他人的智慧。

非常感谢您对这一挑战的见解。

0 投票
1 回答
353 浏览

c++ - `*' 不能出现在常量表达式中

谁能解释我为什么在我的编译过程中存在这些错误?

错误是:

谢谢你的帮助 :)

0 投票
1 回答
700 浏览

f# - 无法在 F# 中创建列表文字

我有以下类型

我收到一个编译时错误,上面写着:

这不是有效的常量表达式或自定义属性值

我真的不知道这里出了什么问题。

0 投票
1 回答
6133 浏览

c++ - 常量表达式中调用的`static constexpr`函数是...错误?

我有以下代码:

我希望因为它foo()是一个static constexpr函数,并且由于它是在bar声明之前定义的,所以这是完全可以接受的。

但是,g++给了我以下错误:

这……没什么用,因为在常量表达式中调用函数的能力constexpr.

clang++有点帮助。除了指出参数 tonoexcept必须是常量表达式的错误消息外,它还说:

那么......这是一个两遍编译问题吗?编译器是否试图在定义类中的所有成员函数之前声明它们的问题?(请注意,在类的上下文之外,编译器都不会抛出错误。)这让我感到惊讶;直观地说,我看不出有任何理由让static constexpr成员函数不能在类内部或外部的任何和所有常量表达式中使用。

0 投票
3 回答
668 浏览

c - 在 C99 中具有可能溢出的常量表达式的初始化程序

这是有效的 C99 代码吗?如果是这样,它是否定义了实现定义的行为?

根据我对 C99 标准的理解,从 ISO C99 标准的 §6.6 开始,这可能是有效的:

  1. 整数常量表达式应具有整数类型,并且应仅具有整数常量的操作数 (...) 整数常量表达式中的强制转换运算符应仅将算术类型转换为整数类型,但作为 sizeof 运算符的操作数的一部分除外。

  2. 初始化器中的常量表达式允许更大的自由度。这样的常量表达式应为或评估为以下之一:

    • 算术常数表达式,
    • (...)
    • 对象类型的地址常量加上或减去整数常量表达式。

但是,由于加法可能会溢出,这可能不会被视为常量表达式,因此不是有效的 C99 代码。

有人可以确认我的推理是否正确吗?

请注意,GCC 和 Clang 都接受此代码而不会发出警告,即使使用-std=c99 -pedantic. 但是,当转换为unsigned int而不是 时unsigned long,即使用以下代码:

然后两个编译器都抱怨该表达式不是编译时常量。

0 投票
1 回答
373 浏览

c++ - g++ 抱怨 constexpr 函数不是常量表达式

我已将我的问题减少到以下几点:

我看不出这有什么问题,但是如果我尝试使用以下命令进行编译g++

在 coliru 上复制

0 投票
1 回答
369 浏览

c++ - 断言可以在常量表达式中使用吗?

-macro assertfrom<cassert>提供了一种确保满足条件的简洁方法。如果参数的计算结果为true,则不会产生任何进一步的影响。但是,在这种情况下,它的调用是否也可以在常量表达式中使用?

0 投票
2 回答
1865 浏览

c++ - double 类型的静态类成员的常量表达式初始值设定项

在 C++11 和 C++14 中,为什么我需要constexpr在以下代码段中:

而这个会产生编译器错误:

并且(更令人惊讶的是)这编译没有错误?

0 投票
4 回答
90 浏览

c - 需要澄清常量表达式

K&R c 第 2 版(第 2.3 节)提到

常量表达式是只包含常量的表达式。这样的表达式可以在编译期间而不是运行时进行评估,因此可以在任何可能出现常量的地方使用

但是,我对此有几个疑问:

  1. 这个表达式会被视为常量表达式吗?

    即使用const关键字是否被认为是常量表达式?

  2. 是否有任何技术可以检查表达式是在编译期间还是在运行时评估的?

  3. 是否存在编译时评估产生与运行时评估不同的结果的情况?

  4. 我什至应该关心它吗?(也许我用它来优化我的程序)

0 投票
3 回答
1870 浏览

c++ - int a=1, 是一个 || 1 常量表达式?

N4527 5.20[expr.const]p5

一个常量表达式要么是一个左值核心常量表达式,其值是指一个实体,该实体是一个常量表达式(如下定义)的允许结果,要么是一个纯右值核心常量表达式,其值是一个对象,对于该对象及其子对象:

— 每个引用类型的非静态数据成员都引用一个实体,该实体是一个常量表达式的允许结果,并且

— 如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、此类对象末尾的地址 (5.7)、函数的地址或空指针值。

如果实体是具有静态存储持续时间的对象,该对象不是临时对象或者是其值满足上述约束的临时对象,或者它是一个函数,则该实体是常量表达式的允许结果。

a || 1常量表达式吗?


N4527 5.20[expr.const]p2

条件表达式 e 是核心常量表达式,除非按照抽象机 (1.9) 的规则对 e 的求值将求值以下表达式之一:

(2.7) — 左值到右值的转换 (4.1),除非它应用于

(2.7.1) — 一个整数或枚举类型的非易失性左值,它指的是一个完整的非易失性 const 对象,该对象具有前面的初始化,用常量表达式初始化,或

(2.7.2) — 引用字符串字面量 (2.13.5) 的子对象的非易失性泛左值,或

(2.7.3) — 一个非易失性泛左值,它指代一个用 constexpr 定义的非易失性对象,或者指代这种对象的一个​​非可变子对象,或

(2.7.4) — 文字类型的非易失性左值,指的是一个非易失性对象,其生命周期开始于对 e 的评估;

a || 1核心常量表达式吗?