我读到有词汇常量,词汇运算符,词汇范围等。术语“词汇”如何改变常数例如字符串文字,任何运算符或某个标识符范围的含义?
答案 0 :(得分:7)
“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
}
答案 1 :(得分:0)
使用术语'词法常量'并不意味着一种不同的常数。
通常,当你谈论C ++语法时,你会使用词汇词汇这个词汇,即词法。而不是将常量存储在对象中,以及文件的范围或矩阵上的运算符。
所以如果我在谈论一行代码,它有一个常量,如:(32786)
我可以使用lexical(可能是不必要的)来确认数字仅作为C ++令牌存在的含义。
所以,当我在谈论C++ tokens及其关系时,我正在使用像wikipedia does这样的词汇。