首页 > 试题广场 >

下面代码的输出结果是?

[单选题]
下面代码的输出结果是?
#include <stdio.h>
int main() {
    int z, x = 5, y = -10, a = 4, b = 2;
    z = x++ - --y * b / a;
    printf("%d\n", z);
    return 0;
}



  • 5
  • 6
  • 10
  • 11
  • 12
5-(-11)*2/4=5-(-22)/4=5-(-5)=-10
发表于 2015-05-15 11:42:56 回复(5)
==================2015.8.32. 修正说明==================

经评论中两位网友的指点,指出了我回答中的错误,测试后,是我原回答错了。

==================以下为原回答==================
z = x++ - --y * b/a;
上面这个式子,在C中其实是理解成 z = ((x++)--)-y * b / a;
所以其实是z = ((5++)--)-(-10)*2/4 = 5-(-5) = 10;
大家不要被题目故意留的空格迷惑了,编译器是不会理那些空格的,它看起来就是z=x++---y*b/a,而C语言读取符号时的词法分析遵循的规则叫“贪心法”,就它读取每一个符号都尽量包括多的字符,赋值号右边的式子从左往右读,第一个字符“x”,然后它会尝试读下一个字符看“x+”能不能组成一个符号,若不行,则读下一个字符,尝试“++”能不能组成一个符号,显然可以,然后再接着往下读“-”,尝试下一个字符“-”,发现“--”也能组成一个字符。
所以上式它会读成   z = ((x++)--)-y * b / a;
编辑于 2015-08-31 00:34:02 回复(13)

 🍹解题步骤


int z, x = 5, y = -10, a = 4, b = 2;
z = x++ - --y * b / a;

step1.首先计算自增自减运算符,先计算 x++ 和 --y。

x++ :先使用x再对x进行++ ——>5
--y :先对y--再使用y的值 ——>-11

step2. * ”、“ / ”位于优先级第三级,“ - ” 位于优先级第四级,所以先进行乘除运算,算术运算符采取左结合,因此自左向右计算🔢。

--y * b / a;
-11 * 2 / 4; -22/4 == -5.5
但是由于采用“ / ",所以会趋零截断得到 -5

(--y * b / a )== -5

step3.最后计算 “ - ”,采用左结合,自左向右计算。

先对x进行减法运算,再对x进行++
z = x++ - (--y * b / a);
z =  5 -(-5)= 10
计算完z = 10后,再对x进行++,最后x的值为6


发表于 2022-01-23 20:56:08 回复(1)
运算符的匹配遵循“贪心法”,但是这道题中(x++)--本身就是错误的,所以是:z = (x++) - ((--y) * b/a)
发表于 2017-01-15 11:00:22 回复(0)
不管正负都是向0的方向取整
发表于 2022-03-12 17:44:39 回复(0)
经测试,z=x++- --y*b/a中,- --中间空格不能省略,否则编译不通过。 另,执行结果是x=6,y=-11,可知结合顺序为 z=(x++)- (--y)*b/a;
发表于 2020-03-04 01:39:52 回复(0)
运算符匹配的贪心算法?个人觉得编译器会猜测字符连在一起是否有意义,有意义且能编译通过就编译成功吧。
  1. z = x++ - --y * b/a; (原题)正常编译,结果为10。
  2. z = x++---y * b/a;(等式右边不存在空白字符分隔)
    编译不通过。test.cpp: In function ‘int main()’:
    test.cpp:15:20: error: lvalue required as decrement operand
                z = x++---y * b/a;
                       ^~
  3. z = x++ ---y * b/a;
    编译不通过。test.cpp: In function ‘int main()’:
    test.cpp:15:21: error: lvalue required as decrement operand
                z = x++ ---y * b/a;
                        ^~
  4. z = x + + - - - y * b / a; (每个字符都被一个空格分隔)
    z  =  x  +  +  -  -  -  y  *  b  /  a;每个字符都被2个空格分隔)
    编译通过。结果为10。
发表于 2019-02-28 13:36:17 回复(0)
运算符优先级
发表于 2022-08-10 00:43:07 回复(0)
运算符匹配遵循贪心法
编辑于 2020-03-01 18:10:13 回复(0)
先乘法再除法……
发表于 2019-12-28 16:52:44 回复(0)
z = x++ - --y * b/a;
x++是在;之后执行的,相当于z=x-(--y)*b/a; x++
所以执行结束后z=5-(-11)*2/4=10,x=6,y=-11
发表于 2019-07-14 14:50:10 回复(0)
在C中其实是理解成 z = ((x++)--)-y * b / a;
所以其实是z = ((5++)--)-(-10)*2/4 = 5-(-5) = 10;
发表于 2018-07-13 20:41:08 回复(0)
(-22)/4=-5
发表于 2017-09-02 16:06:00 回复(0)
恕我多嘴、、、这题没看出来意义在哪
发表于 2017-07-31 18:43:20 回复(0)
(int)22/4=5
发表于 2017-07-26 11:02:19 回复(0)
注意 -22/4是等于5的……
发表于 2017-06-23 23:29:28 回复(0)
回答这个问题很简单 只要把数据类型改成float 然后在打印x的值 看输出结果就知道谁对谁错
发表于 2017-03-22 12:32:17 回复(0)
1.++(--)写在后面先执行运算后进行自加(自减),写在前面则相反 2.先执行乘除操作后执行加减操作
发表于 2016-09-11 16:37:58 回复(0)
贪心算法的应用
发表于 2016-03-12 19:37:52 回复(0)
z = 5 - -11*2/4=10
发表于 2015-05-15 16:41:47 回复(0)