c程序问题 int n=5; int m; m=n++*--n-n⼀2*n+n+加; m等于多少?

2025-03-10 07:43:23
推荐回答(1个)
回答1:

m 的值是不确定的。在 VS 中,m 的值为 12,在 Dev C++ 中,m 的值为 20。

C/C++也没有明确规定,一般认为:

  1. 以 ++ 为例(-- 类似),分前缀(例如 ++n)和后缀(n--)这两种。

  2. 后缀的优先级比前缀的优先级要高。

  3. 后缀的结合性是自左向右,前缀的结合性是自右向左。

  4. n++ 是先使用 n 的值,最后再 +1。

  5. ++n 是先 +1,最后再使用 n 的值。

  6. 一般常用于简单的运算,切记不要用于复杂的运算。其最终的结果视不同编译器而定。

在 Dev C++ 中运行的结果分析:

  1. 先列出求解等式:m = n++ * --n - n / 2 * n + n++。

  2. 按照上述第 4、5 点的规则,首尾的 n++ 可以忽略(因为是先使用 n 的值,最后才 +1)。此时等式变成:m = n * --n - n / 2 * n + n。

  3. 等式中的运算符的优先级从高到低依次为【-- 】、【* /】、【+ -】。

  4. 先算 --n 的结果,此时 n 由原来的 5 变为 4。

  5. 此时等式相当于:m = 4 * 4 - 4 / 2 * 4 + 4,很明显 m = 12。

  6. 最后 n 在进行两次 +1,所以 n = 6。

在 Dev C++ 中运行的结果分析:

  1. 先列出求解等式:m = n++ * --n - n / 2 * n + n++。

  2. 在Dev C++ 中,编译器是 GCC,像这种含有前缀和后缀的,先进行左边的 n++,此时取出 n 的值,然后再自加(不等整条语句结束再自加)。

  3. 所以此时等式相当于:m = 5 * --6 - 6 / 2 * 6 + 6++。

  4. 再运算 --n,n 先 -1,再使用 n 的值,此时等式相当于:m = 5 * 5 - 5 / 2 * 5 + 5++。

  5. 此时等式相当于 m = 25 - 10 + 5++ = 20。

  6. 最后执行 5++,此时 n = 6。

总结:

  1. 很明显,对于 VS 来说,比较容易理解自加和自减运算符的运算逻辑,但是对于 Dev C++ 来说,就相对复杂不少。

  2. 创造了自加和自减运算符是为了更加方便写代码而已,一般不会像题目这么使用。所以也没必要纠结它最终的结果是多少。

  3. 如果非要确定一种,那么以 VS 的结果为准。

不同编译器下的结果:

在VS下运行的结果

在Dev C++下运行的结果