技术开发 频道

Java和C++在细节上的差异(一)

  一、基本程序设计结构:

       Java的基本程序结构、关键字、操作符都和C/C++非常相似,以下为主要的几点区别:

  1. Java的原始数值型数据类型中不包含无符号类型,如c中的unsigned int。

  2. 在进行移位运算时,当向左边移动时,如1 << 35, 对于int类型,由于其占有4个bytes(32bits), 因此在Java中,大于32的移位将对32取模,即1 << 35的结果等于1 << 3,以此类推,long将会对64取模。对于int类型而言,如果确实需要获取32位以上的移位,需要将返回值的类型提升到long即可。

  3. 在c语言中,可以通过判断一个数值是否为0来代替布尔中的false,其他的数值均表示为true。该写法可应用于if和while等子句中,如 if (i) {....}, 当i的值不为0时,该条件可为真,或者是在判断指针对象是否为NULL时,也可作为if和while的条件,因此很容易出现将if (i == 9) {...}写成if (i = 9) {...}的低级错误,在Java中禁止了该类转换,既if和while中条件必须是布尔类型,如果在Java中写成 if (i = 9) {...}将会直接导致编译错误,从而更好的避免了该类问题的发生。

  4. Java中去除了goto字句,但是仍然视为保留字。然而Java中的break字句,新增了带标签的break [label],可以使break语句直接跳出指定的循环,而不仅仅是缺省的最内层循环。注:标签必须放在希望跳出的最外层循环之前,并且紧跟一个冒号。如:

1     public void test() {
2         int n;
3         read_data:
4         while (...) {
5             for (...) {
6                 System.out.print("Enter a number >= 0: ");
7                 n = in.nextInt(); 8                 if (n < 0)
9                     break read_data;
10             }
11         }
12         //下面的代码将会被立即执行,当break跳出最外层的循环之后。
13         if (n < 0) {
14             ...
15         } else {
16             ...
17         }
18     }

  5. Java中支持0长度的数组定义,如int et = new int[0]; 在C/C++中,该写法将会导致编译错误。

  6. 多维数组的两种常用访问方式。

1         public static void main(String[] args) { 2             int[][] magicSquare =  
3             {
4                 {16,3,2,13},
5                 {5,10,11,8},
6                 {9,6,7,12},
7                 {4,15,14,1}
8             };
9             // 通过普通的for循环访问
10             for (int i = 0; i < magicSquare.length; ++i) {
11                 for (int j = 0; j < magicSquare[i].length; ++j) {
12                     System.out.printf("%s ",magicSquare[i][j]);
13                 }
14                 System.out.println();
15             }
16             // 通过普通的for each循环访问17             for (int[] row : magicSquare) {
18                 for (int col : row) {
19                     System.out.printf("%s ",col);
20                 }
21                 System.out.println();
22             }
23         }
24         /*两次输出结果均为:        
25           16 3 2 13
26           5 10 11 8
27           9 6 7 12
28           4 15 14 1 */

  7. Java中的不规则二维数组。

1 public void foo() {
2     int[][] odds = new int[NMAX+1][];
3     for (int n = 0; n <= NMAX; ++n)
4         odds[n] = new int[n + 1];
5      
6     for (int n = 0; n < odds.length; ++n) { 7         for (int k = 0; k < odds[n].length; ++k)
8             odds[n][k] = n * k;
9     }
10 }
 

  C/C++中对应于Java的不规则二维数组的表示方式。

1         void foo() {
2             int** odds = new int*[10];
3             for (int n = 0; n < 10; ++n) {
4                 if (n == 0)
5                     odds[n] = new int;
6                 else
7                     odds[n] = new int[n + 1];
8             }
9                
10             for (int n = 0; n < 10; ++n) {
11                 for (int k = 0; k < n + 1; ++k)
12                     odds[n][k] = n * k;
13             }
14             //注:C/C++代码部分需要自行释放分配的内存。            
15             for (int n = 0; n < 10; ++n) {
16                 if (n == 0)
17                     delete odds[n];
18                 else
19                     delete [] odds[n];
20             }
21             delete [] odds;
22         }
  
0
相关文章