A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘圣涛 中级黑马   /  2014-7-11 00:38  /  1967 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

之前做的一道题目,貌似结果是输出是2 0,不过现在思路有点混乱,有哪位大神能帮忙详细解答一下?
int main()
{ int n=4;
    while (n--)
     printf(〞%d〞,--n);
}

14 个回复

倒序浏览
本帖最后由 fantacyleo 于 2014-7-11 00:46 编辑

n--和--n最关键的是分清变量的值和表达式的值。无论--在前还是在后,执行完后变量的值一定都减了1。但是,表达式的值是不同的:n--这个表达式的值是n减1之前的值,--n这个表达式的值是n-1之后的值

点评

赞一个。  发表于 2014-7-11 10:30
回复 使用道具 举报
  1. //main()
  2. //{
  3. //    int n=4;                    第一轮                 第二轮        第三轮
  4. //    while (n--)                 4   n =  3          2   n = 1     0    循环退出
  5. //        printf(〞%d〞,--n)输出:  2   n = 2     输出:0  n = 0
  6. //        }
复制代码
回复 使用道具 举报
首先n--的表达式值为n,然后n-1,--n的表达式值为n-1;又每次判断和输出n都会-1,所以此while循环只执行2次,第一次判断后n=3,输出是--n,所以打印出2出来,n的值为2;第二次判断后n=1,输出是--n,所以打印出0,n的值为0
回复 使用道具 举报
本帖最后由 zhs 于 2014-7-11 11:28 编辑

此代码的执行步骤为:
第一步:n先运算即while判断n为4成立(注意:此时不会直接进入循环,因为n--表达式还没有执行结束),而后紧跟着会n自减1后表达式结束,这时才进入循环。
第二步:进入循环后输出时执行--n,先自减,此时n变为2,随后执行输出语句n=2输出。
输出结果0思路同上,楼主可以自己过一遍。
回复 使用道具 举报
这是一个先减和后减的问题,第一次运行,n是后减,所以当while循环的时候,n已经减1变成3,打印的时候,是先减后打印,所以先打印2,如果减号放在n的后面,那就是先打印3,循环的时候再减。再次循环的时候,当while中n的值为2,满足,继续运行,此是n已经变成了1,然后打印的时候再减一次,所以就变成了0;
回复 使用道具 举报
2 0;n = 4; n--时,先将n=4代表n--参与判断,之后将n减1(为3);printf中--n,先将n减去1(为2),之后n代表--n输出。
回复 使用道具 举报
愿望 中级黑马 2014-7-11 17:42:05
8#
本帖最后由 愿望 于 2014-7-11 17:43 编辑

我自己的话,来说, 不知道你能不能理解,
  运行到while的时候,n还是4, 但是经过n--就变成3 . 3就来到了 printf里,  "--n"是先减之后再赋值, 减了变成2,这就输出了一个2 ;

  2再回来while里, 一样,经过 n--就变成1 , 成立, 1 又来到了printf里, 再被--n一运行, 就变成了0 , 于是输出了0
  0再回去 while的条件就不成立了. over

主要明白后面的--n是要先减再printf这个地方, 就明白了!  
   希望你看的明白.....:)
回复 使用道具 举报
幕夏 中级黑马 2014-7-11 23:43:02
9#
细化一下你的代码这个你应该看懂了
  1. int main()
  2. { int n=4;
  3.     while (n!=0)
  4.      n--;
  5.      --n;
  6.      printf(〞%d〞,n);
  7. }
复制代码

回复 使用道具 举报
C语言基本已忘光
回复 使用道具 举报
这个程序的思路是这样的:while循环语句 先从4开始 whil(4--)此时因为4--也就是4!=0进入循环体输出--n也就是输出此时的n也就是4
回复 使用道具 举报
关键要分清判断时与判断后n的值,第一轮:判断时,n=4,判断后,n=3,打印时:n=2,
第二轮,判断时:n=2,判断后:n=1,打印时:n=0;
第三轮,判断时,n=0,循环结束
回复 使用道具 举报
谢谢大家的回答
回复 使用道具 举报
int main()
{ int n=4;
    while (n--) //先判断n的值是否为0,不为0就往下走 第一次n=4 到printf之前n--变为3
     printf(〞%d〞,--n);//先减1再输出 n变为2 如此循环最终结果为: 2,0
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马