C程序中preincrement算子的行为

时间:2012-04-26 08:33:06

标签: c pre-increment

我正在运行以下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 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:-1)

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

首先需要两个值来乘以它,然后将第三个值与结果相乘,所以序列应为,

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

4 * 4 => 16,

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

16 * 5 => 80

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

答案 2 :(得分:-1)

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

答案 3 :(得分:-1)

表达式++x*++x*++x将增加x三次的值,即分配给表达式的x的值为5。所以5*5*5 = 125是输出。同样,值取决于编译器的体系结构。