这是一个涉及编程的可能面试问题和答案在这里。
以下代码是否会在C语言中编译通过?
#define X 8;
int main(void)
{
++X; // will this line compile?
}`
我不是C语言专家,但我了解一些C++,我认为:当然不能对数字8进行递增操作,因为它是一个右值。当然,在尝试编译之前,预处理器会将
X
替换为8
,并且在尝试编译时,由于这个原因,编译会失败。再说,我是那个阅读面试问题网站的人,所以我想谁知道...
这里是给出的解释:
“严格来说,前缀(或后缀)递增运算符的操作数必须是一个不可修改的左值。既然我们知道什么是左值,我们必须问自己X是否是左值。X是一个宏,这意味着它不标识内存中的任何位置-宏通过预处理器使用简单的文本替换。因为宏不存在于内存区域中,所以它们不是左值。这意味着X不能用作前缀递增运算符的操作数。因此,上面显示的代码将无法编译。”
这个解释和我想的一样荒唐吗?
你能发现多少错误?我想也许这应该是面试问题...
这只是有趣的:
"直觉上,你可能会说上面的代码无法编译 - 虽然不知道具体原因。但是,在面试中,你需要提供一些像上面给出的理由。简单的是或否答案在面试中不够用。" (!)
#define X 8
而不是带分号的形式。 - Andrejs Cainikovsmain
函数结尾处使用return 0;
或其他数字也是一个错误。 - Chris LutzX
不是指向“内存中的位置”这个事实并不意味着它是一个宏,而是它被定义为什么很重要。例如,#define X var
//int main() { int var = 5; ++X; }
是可以的。 - CB Bailey