问题描述
,句法是只关心句子是否对语言的语法有效的概念。语义是关于句子是否具有有效含义。
语法是关于语言的 或语法的。它回答了这个问题:我如何构造一个有效的句子?所有语言,甚至英语和其他人类(又名“自然”)语言都有语法,即定义句子是否正确构造的规则。
以下是一些 C 语言语法规则:
- 用分号分隔语句
- 将 IF 语句的条件表达式括在括号内
- 通过用花括号括起来将多个语句组合成一个语句
- 数据类型和变量必须在第一个可执行语句之前声明(此功能已在 C99 中删除。C99 及更高版本允许混合类型声明。)
语义是关于句子的 。它回答了以下问题:这句话有效吗?如果是这样,这句话是什么意思?例如:
x++; // increment
foo(xyz, --b, &qrs); // call foo
是语法上有效的 C 语句。但它们是什么意思?尝试将这些语句转换为可执行的指令序列是否有效?这些问题是语义学的核心。
考虑第一条语句中的 ++ 运算符。首先,尝试这样做是否有效?
- 如果 x 是浮点数据类型,则该语句没有意义(根据 C 语言规则),因此 _ _
- 如果 x 是指向 的指针,则该语句的含义是“将 sizeof( ) 添加到地址 x 处的值,并将结果存储到地址 x 处的位置”。
- 如果 x 是标量,则语句的含义是“将地址 x 处的值加一并将结果存储到地址 x 处的位置”。
最后,请注意,某些语义无法在编译时确定,因此必须在运行时进行评估。在 ++ 运算符示例中,如果 x 已经是其数据类型的最大值,那么当您尝试将 1 添加到它时会发生什么?另一个例子:如果你的程序试图取消引用一个值为 NULL 的指针会发生什么?
解决方法
编程语言(如 C、C++)中 的 语法 和 语义 有什么区别?