我正在运行下面的C代码:
#define cube(x) (x*x*x)
void main()
{   
    int x=2,y;   
    y=cube(++x);            
    printf("%d %d",++x,y);    
}我期待的结果是
6,60但它给出了不同的结果。我想我对预处理器有误解。我认为代码将类似于
void main()
{   
    int x=2,y;   
    y=++x*++x*++x;            
    printf("%d %d",++x,y);    
}如果我错了,请纠正我。
我将结果解释为3*4*5=60
但它马上就要来了
发布于 2012-04-26 16:36:08
您定义了一个宏,它的工作方式是简单的字符串替换,因此所显示的翻译是正确的。
然而,子表达式的执行顺序是未定义的,例如,它们可以是交错的,这使得未定义的行为。
发布于 2012-04-26 17:23:38
预处理器采用我们给出的表达式,所以,对于你的c代码,最初是x=2,所以在执行宏的时候,
首先是两个值相乘,然后是第三个值与结果相乘,所以序列应该是,
++x * ++x => 3(第一个增量),4 (再次用于下一个增量),因此根据表达式,现在x值是4
4 * 4 => 16,对于下一个增量x => 5,根据表达式结果应该是,
16 * 5 => 80所以现在乘法的总结果是80,x值是5。
发布于 2012-04-26 18:27:23
此程序的输出因编译器、操作系统甚至同一编译器的不同版本而不同,因为输出依赖于子表达式的执行顺序。
我用Visual Studio编译的: o/p是125。
当我和gcc一起编译时: o/p是80。
所以你不能预测输出。
我不知道为什么人们会在面试中问这些类型的问题(那些没有明确答案的问题)?
https://stackoverflow.com/questions/10329814
复制相似问题