我正在运行以下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
答案 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
是输出。同样,值取决于编译器的体系结构。