4

我正在运行以下 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
但它即将到来 125

4

4 回答 4

5

您定义了一个宏,它用作简单的字符串替换,因此呈现的翻译是正确的。

但是,子表达式的执行顺序是未定义的,例如,它们可以是交错的,这会导致未定义的行为

于 2012-04-26T08:36:07.530 回答
-1

预处理器采用我们给出的表达式,因此,对于您的 c 代码,最初 x=2,因此在执行宏时,

首先需要两个值相乘,然后将第三个值乘以结果,所以序列应该是,

++x * ++x => 3(第一个增量),4(再次为下一个增量),所以现在 x 值为 4,根据表达式

4 * 4 => 16,

再次为下一个增量 x => 5,所以根据你的表达式结果应该是,

16 * 5 => 80

所以现在乘法的总结果是 80,x 值为 5。

于 2012-04-26T09:23:37.800 回答
-1

该程序的输出因编译器、操作系统甚至同一编译器的不同版本而异,因为输出取决于子表达式的执行顺序。
我用 Visual Studio 编译:o/p 是 125。
当我用 gcc 编译时:o/p 是 80。
所以你无法预测输出。
而且我不知道为什么人们会在面试中问这些类型的问题(那些没有明确的结果)?

于 2012-04-26T10:27:22.573 回答
-1

表达式将++x*++x*++x增加x三次的值,即分配给表达式的值。输出也是如此。同样,该值因编译器的体系结构而异。x55*5*5 = 125

于 2012-04-26T10:42:42.703 回答