小编典典

编程语言中的语法和语义有什么区别?

all

编程语言(如 C、C++)中 的 语法语义 有什么区别?


阅读 109

收藏
2022-08-15

共1个答案

小编典典

TL; 博士

总而言之 ,句法是只关心句子是否对语言的语法有效的概念。语义是关于句子是否具有有效含义。

长答案:

语法是关于语言的 结构
或语法的。它回答了这个问题:我如何构造一个有效的句子?所有语言,甚至英语和其他人类(又名“自然”)语言都有语法,即定义句子是否正确构造的规则。

以下是一些 C 语言语法规则:

  • 用分号分隔语句
  • 将 IF 语句的条件表达式括在括号内
  • 通过用花括号括起来将多个语句组合成一个语句
  • 数据类型和变量必须在第一个可执行语句之前声明(此功能已在 C99 中删除。C99 及更高版本允许混合类型声明。)

语义是关于句子的 含义 。它回答了以下问题:这句话有效吗?如果是这样,这句话是什么意思?例如:

x++;                  // increment
foo(xyz, --b, &qrs);  // call foo

是语法上有效的 C 语句。但它们是什么意思?尝试将这些语句转换为可执行的指令序列是否有效?这些问题是语义学的核心。

考虑第一条语句中的 ++ 运算符。首先,尝试这样做是否有效?

  • 如果 x 是浮点数据类型,则该语句没有意义(根据 C 语言规则),因此 _ 即使该语句在语法上是正确的,它也是一个错误。_
  • 如果 x 是指向 某个数据类型 的指针,则该语句的含义是“将 sizeof( some data type ) 添加到地址 x 处的值,并将结果存储到地址 x 处的位置”。
  • 如果 x 是标量,则语句的含义是“将地址 x 处的值加一并将结果存储到地址 x 处的位置”。

最后,请注意,某些语义无法在编译时确定,因此必须在运行时进行评估。在 ++ 运算符示例中,如果 x 已经是其数据类型的最大值,那么当您尝试将 1
添加到它时会发生什么?另一个例子:如果你的程序试图取消引用一个值为 NULL 的指针会发生什么?

2022-08-15