【发布时间】:2011-11-07 21:26:34
【问题描述】:
我读到有词法常量、词法运算符、词法范围等。术语“词法”如何改变常量的含义,例如字符串文字、任何运算符或某个标识符的范围?
【问题讨论】:
标签: c++
我读到有词法常量、词法运算符、词法范围等。术语“词法”如何改变常量的含义,例如字符串文字、任何运算符或某个标识符的范围?
【问题讨论】:
标签: c++
“lexical”表示与源代码相关。
例如,1 是一个词法常数。 OTOH,sizeof(char) 也是编译时整数常量表达式,但它不是词法常量。从词法上讲,它是对sizeof 运算符的调用。
词法运算符作用于源代码。预处理器运算符属于这一类。
在大多数情况下,我在程序中的任何位置使用1 或sizeof(char) 都没有区别。但是,作为词法运算符 # 或 ## 的参数,它产生了相当大的不同,因为它们适用于实际代码而不是评估结果:
#define STR(x) #x
std::string one = STR(1);
std::string also_one = STR(sizeof(char));
最后,词法范围是指程序源代码中存在标识符的部分(被识别,可以使用)。这与动态范围(也称为对象生存期)形成对比,后者是对象存在的程序部分(保持其值并且可以通过指针或引用间接操作,即使名称不在词法范围内) .
string f(string x) { return "2" + x; } // main's "y" is not in lexical scope, however it is in dynamic scope, and will not be destroyed yet
int main(void)
{
string y = "5.2"; // y enters lexical scope and dynamic scope
string z = f("y"); // y leaves lexical scope as f is called, and comes back into lexical scope when f returns
return z.size();
// z leaves lexical and dynamic scope, destructor is called
}
【讨论】:
使用术语“词法常数”并不意味着另一种常数。
一般来说,当你谈论 C++ 语法时,你会使用词法 this,词法 that。与将常量存储在对象、文件的范围或矩阵上的运算符相反。
如果我说的是一行代码,它有一个常量,例如:(32786)
我可以使用词法(可能是不必要的)这个词来确认数字仅作为 C++ 标记存在的含义。
所以当我谈论C++ tokens 和它们之间的关系时,我会使用像wikipedia does 这样的词汇。
【讨论】: