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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

先声明,我只是一个初学者!
而后我用的是vc++6.0编译器,所以书写格式是按照c语言写的、
废话不多说,先上代码:


#include "stdafx.h"
#include <stdio.h>


int main(int argc, char* argv[])
{
        int i;
        i=0;
        int n = 0;
//        n = i++;
       
        //上面的不说,非常简单的变量定义没有问题。可是下面问题就来了、
        n=(i++);        //按理说“()”的运算优先级是高于“=”为什么运算出来的结果是“n=0”
        n==i++;                //这行代码是我故意写错的,为什么能正常通过编译?并且i实现了自增的运算,难道这行代码没有写错吗?
        printf("i = %d\n",i);
       
        printf("n = %d\n",n);

        return 0;
        //最后一个问题为什么我注释“n=(i++)”或“n = i++”任意一行,运行的结果“n=0”,而当这两行都能正常执行却是“n=1”这两行之间有什么必要的联系吗?
}
作为一个初学者我很迷惑这样的看起来非常简单小问题,求各位大神解答,小弟不胜感激!

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 qq379264347 于 2013-11-30 23:56 编辑

首先我把你的C源码进行了修改,你看一下输出结果,也许会明白很多。
  1. #include <stdio.h>


  2. int main(int argc, char* argv[])
  3. {
  4.         int i;
  5.         i=0;
  6.         int n = 0;
  7. //        n = i++;
  8.         
  9.         //上面的不说,非常简单的变量定义没有问题。可是下面问题就来了、
  10.         n=(i++);        //按理说“()”的运算优先级是高于“=”为什么运算出来的结果是“n=0”
  11.         n==i++;                //这行代码是我故意写错的,为什么能正常通过编译?并且i实现了自增的运算,难道这行代码没有写错吗?
  12.         printf("i = %d\n",i);
  13.         
  14.         printf("n = %d\n",n);

  15.         if(n==i++)
  16.           printf("true");
  17.         else
  18.           printf("n = %d, i = %d\n",n,i);
  19.          
  20.         n=4;
  21.         
  22.         if(n==++i)
  23.           printf("true\n");
  24.         else
  25.           printf("n = %d, i = %d\n",n,i);
  26.          
  27.         return 0;
  28.         //最后一个问题为什么我注释“n=(i++)”或“n = i++”任意一行,运行的结果“n=0”,而当这两行都能正常执行却是“n=1”这两行之间有什么必要的联系吗?
  29. }
复制代码

最后输出信息如下:
  1. i = 2
  2. n = 0
  3. n = 0, i = 3
  4. true
复制代码


再来回答一下你的问题。

运算符 = 是赋值运算符,并不是简单的等于号,也不是等于运算,等于运算进行判断的话是两个等于号 == 。
赋值运算符 = 是把等号右面的值给左面的变量。
这个右面可以是数值,也可以是表达式,若是表达式的话,是把表达式的值给左面。
int n = 0;
n = 1+5+5;
这时候很明显,n值是11了,那么你加个括号呢?
n = 1+(5+5);
还是11,可能举例不好,看下面:
int n = 0;
n = 2+2*5+1+0;

n = (2+2)*5+1+0;
值就不一样了。

n=(i++);可以理解为n=(i++)+0; 你这个括号其实不起任何作用的。
i++的表达式值就是i没有自增的原始值。



至于n==i++;嘛,你看了我上面的c源码,可能会明白很多吧。这句就是一个if里的判断句。
在c语言中编译通过的,但是在java中就编译报错了,可能java更严谨吧,对语法要求比c严格,比如c中可以用非0代替if里的真值,但java中必须是true。


我改了一下java源码,你看一下吧:
  1. public class zcb {
  2.         public static void main(String[] args) {
  3.                 int i;
  4.                 i = 0;
  5.                 int n = 0;
  6.                 n=(i++);
  7.                 System.out.println("n = " + n); //n = 0
  8.                 System.out.println("i = " + i); //i = 1

  9.                 //n==i++;   编译提示该处 “不是语句”

  10.                 if(n==i++); //if里没有实际代码,但有分号,可以编译运行
  11.                 System.out.println("n = " + n); //n = 0
  12.                 System.out.println("i = " + i); //i = 1
  13.                
  14.                 System.out.println(n==i++);
  15.         }
  16. }

  17. /*
  18. 输出结果:
  19. n = 0
  20. i = 1
  21. n = 0
  22. i = 2
  23. false
  24. */
复制代码

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 刘敏 于 2013-12-1 00:49 编辑

int main(int argc, char* argv[])
{
        int i;
        i=0;
        int n = 0;
//     n = i++;
        //上面的不说,非常简单的变量定义没有问题。可是下面问题就来了、
        n=(i++);        //按理说“()”的运算优先级是高于“=”为什么运算出来的结果是“n=0”(这里是后置++,也就是先把i的值给n,然后自己加1, 此时i先把0给n,然后i变成1 )
        n==i++;                //这行代码是我故意写错的,为什么能正常通过编译?并且i实现了自增的运算,难道这行代码没有写错吗?(这句话的意思是比较 n 和i++ 的值是否相等,可以编译通过,这句话不会改变n的值 )
        printf("i = %d\n",i);
        
        printf("n = %d\n",n);

        return 0;
        //最后一个问题为什么我注释“n=(i++)”或“n = i++”任意一行,运行的结果“n=0”,而当这两行都能正常执行却是“n=1”这两行之间有什么必要的联系吗?(很有联系,第一句话执行后,n=0, i=1;第二句话执行的时候,是i先把刚才的1又给n,n=1,然后自己i自己+1,最后i=2 )
}
作为一个初学者我很迷惑这样的看起来非常简单小问题,求各位大神解答,小弟不胜感激!

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马