C语言 表达式:“带值”与“计算为值”

fumotvh3  于 2023-03-17  发布在  其他
关注(0)|答案(1)|浏览(107)

在(常量)表达式的上下文中:“有价值”与“评估为价值”有何区别?
以下是C11中的一些引文(重点已添加):
常量表达式应为整型常量表达式。它应计算为有效的基本对齐,
表达式math_errhandling & MATH_ERREXCEPT应计算为非零值。
switch语句中最多只能有一个默认标签。(任何包含的switch语句都可以有一个默认标签或case常量表达式**,其值与包含的switch语句中的case常量表达式重复。)
定义的宏扩展为整型常量表达式
,其值为**...
下表中给出的值应替换为实现定义的常量表达式**,其值为**...
...表达式是有效的整型常量表达式**,值为**一
“有值”和“求值为值”是同义词吗?

daupos2t

daupos2t1#

“有值”和“求值为值”是同义词吗?

TL;DR:是。

语言规范没有正式定义术语“evaluate”,因此我们必须依赖于传统的英语定义,例如Merriam-Webster中的以下定义:
确定或固定...的价值
在更数学化的上下文中,例如应用于C表达式,我将“evaluate to“理解为是指计算时确定的值。
规范确实定义了“值”,但这个定义并没有对手头的问题提供多少帮助。
我检查了C11语言规范中所有出现的“with value“/“with values that”和“evaluate to”(因为这是问题中引用的版本),前者出现了10次:

  • 6.4.4.1/3
  • 脚注118
  • 6.7.2.2/3
  • 6.8.4.2/3
  • 7.6/6
  • 7.11.2/2
  • 7.22.1.3/4
  • 7.29.4.1.1/4
  • E/5
  • H.2.1标准

还有一两种密切相关的形式,如E/6中的“with(positive)values that”。
“评估为”表单出现9次:

  • 6.6/4
  • 6.6/7
  • 6.7.5/3
  • 6.7.6.2/6
  • 6.10.1/1
  • 脚注168
  • F.10/4
  • J.2/1(出庭2次)

在这两个类别中,有许多都是关于常量表达式的值,但只有少数几个是专门与 constants 的值相关的,其余的都是关于不一定是常量表达式的表达式的值。
就我所能确定的,这两种形式在C语言概念中可以互换使用。我看到的唯一区别是英语语法和用法。“with value“形式用于在关于表达式的更广泛声明的上下文中提供对表达式值的要求时。“evaluate to“形式用于在如下情况下提供对表达式值的要求时一个独立的陈述。这个问题给出了几个很好的例子。
这是编辑的选择,没有技术意义。

相关问题