Java 表達(dá)式、語(yǔ)句和塊
我們?cè)谇懊娴男」?jié)中,已經(jīng)學(xué)習(xí)了變量和運(yùn)算符。有了這些前置知識(shí),我們就可以學(xué)習(xí)表達(dá)式、語(yǔ)句和塊了。
運(yùn)算符可用于構(gòu)建表達(dá)式,表達(dá)式可以進(jìn)行值的計(jì)算,它是語(yǔ)句的核心組成部分;而語(yǔ)句是指令式編程語(yǔ)言中最小的獨(dú)立元素;多條語(yǔ)句又可以組成語(yǔ)句塊。本小節(jié)我們將學(xué)習(xí)表達(dá)式的概念和常用分類,也將了解到什么是語(yǔ)句和塊。
1. 表達(dá)式
1.1 概念
表達(dá)式,是由數(shù)字、運(yùn)算符、數(shù)字分組符號(hào)(括號(hào))、自由變量和約束變量等以能求得數(shù)值的有意義排列方法所得的組合。約束變量是在表達(dá)式中已被指定數(shù)值,而自由變量則可以在表達(dá)式之外另行指定數(shù)值。
在 Java
中,表達(dá)式是根據(jù) Java 語(yǔ)法由變量、運(yùn)算符和方法調(diào)用組成的結(jié)構(gòu),表達(dá)式的結(jié)算結(jié)果為單個(gè)值。
表達(dá)式實(shí)例:
public class Expression {
public static void main(String[] args) {
int a = 10, b = 20;
// (a + b) * 2 就是一個(gè)算數(shù)表達(dá)式
int c = (a + b) * 2;
// c > b 就是一個(gè)布爾表達(dá)式
if (c > b) { // if語(yǔ)句將在下一小節(jié)講到,此處只需知道 c > b 是一個(gè)表達(dá)式即可
System.out.println("c大于b");
}
}
}
上面代碼中,(a + b) * 2
就是一個(gè)算數(shù)表達(dá)式,而 c > b
就是一個(gè)布爾表達(dá)式,代碼中的 if
語(yǔ)句將在下一小節(jié)講到,此處只需知道 c > b 是一個(gè)表達(dá)式即可。
下面我們將圍繞算數(shù)表達(dá)式和布爾表達(dá)式來(lái)學(xué)習(xí)表達(dá)式。
1.2 分類
1.2.1 算數(shù)表達(dá)式
算數(shù)表達(dá)式是最常用的表達(dá)式,又稱為數(shù)學(xué)表達(dá)式。它是通過(guò)算術(shù)運(yùn)算符來(lái)進(jìn)行運(yùn)算的數(shù)學(xué)公式。
為了使用 Java
進(jìn)行算數(shù)運(yùn)算,首先必須至少聲明一個(gè)變量。如下:
int num = 10;
變量創(chuàng)建后,可以使用算數(shù)運(yùn)算符(+
、-
、*
、/
、 %
、++
、 --
)來(lái)操作變量的值。使用算數(shù)表達(dá)式的實(shí)例如下:
public class ArithmeticExpression1 {
public static void main(String[] args) {
int num = 10;
int result = num / 3;
System.out.println( num + " / 3 = " + result);
}
}
編譯執(zhí)行程序,屏幕上將會(huì)打?。?/p>
10 / 3 = 3
對(duì)于操作數(shù)為整型的除法表達(dá)式,其計(jì)算結(jié)果將始終取整數(shù)部分。所以上面的 10 / 3
的結(jié)果等于 3
。如果我們想得到小數(shù),可以使用浮點(diǎn)類型的變量來(lái)作為操作數(shù)(10.0 / 3
),其返回的值也是一個(gè)浮點(diǎn)型。
除了除法表達(dá)式之外,在使用自增 / 自減表達(dá)式運(yùn)算的時(shí)候,也要額外注意前后自增 / 自減運(yùn)算符的差別。我們來(lái)看下面一個(gè)實(shí)例:
public class ArithmeticExpression2 {
public static void main(String[] args) {
// 前自增
System.out.println("------ 前自增 ------");
int num = 10;
System.out.println("++num = " + (++num));
System.out.println("num = " + num);
// 前自減
System.out.println("------ 前自減 ------");
num = 10;
System.out.println("--num = " + (--num));
System.out.println("num = " + num);
// 后自增
System.out.println("------ 后自增 ------");
num = 10;
System.out.println("num++ = " + (num ++));
System.out.println("num = " + num);
// 前自減
System.out.println("------ 前自減 ------");
num = 10;
System.out.println("num-- = " + (num --));
System.out.println("num = " + num);
}
}
注意觀察前后自增自減的區(qū)別,運(yùn)行結(jié)果:
------ 前自增 ------
++num = 11
num = 11
------ 前自減 ------
--num = 9
num = 9
------ 后自增 ------
num++ = 10
num = 11
------ 前自減 ------
num-- = 10
num = 9
結(jié)論:
-
前自增 / 自減的運(yùn)算規(guī)則是:先進(jìn)行自增或者自減運(yùn)算,再進(jìn)行表達(dá)式運(yùn)算;
-
后自增 / 自減的運(yùn)算規(guī)則是:先進(jìn)行表達(dá)式運(yùn)算,再進(jìn)行自增或者自減運(yùn)算。
1.2.2 布爾表達(dá)式
布爾表達(dá)式(Boolean expression)的結(jié)果只有 true
(真)和 false
(假)兩個(gè)值。在 Java
語(yǔ)言中,布爾表達(dá)式可以使用關(guān)系運(yùn)算符或邏輯運(yùn)算符來(lái)代替算數(shù)運(yùn)算符。
我們來(lái)看一個(gè)使用關(guān)系運(yùn)算符的實(shí)例:
public class BooleanExpression1 {
public static void main(String[] args) {
// 初始化兩個(gè)整型變量a、b,值分別為2、3
int a = 2, b = 3;
// 分別打印比較運(yùn)算符比較的結(jié)果
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a > b);
System.out.println(a < b);
System.out.println(a >= b);
System.out.println(a <= b);
}
}
請(qǐng)閱讀上面代碼,并算出每一次打印的結(jié)果。這里不再展示代碼打印結(jié)果。
布爾表達(dá)式常作為條件分支語(yǔ)句中的條件。因此下面的示例需要你對(duì)條件語(yǔ)句有一定的了解,我們?cè)賮?lái)看一個(gè)稍微復(fù)雜一些的實(shí)例:
public class BooleanExpression2 {
public static void main(String[] args) {
// 初始化4個(gè)整型變量
int i = 4, j = 5, k = 7, m = 8;
// i > j && m < k++ 即為條件表達(dá)式
if(i > j && m < k++) {
k++;
} else {
k--;
}
System.out.println("k = " + k);
}
}
編譯執(zhí)行代碼,屏幕上將會(huì)打?。?/p>
k = 6
上述代碼,是使用邏輯運(yùn)算符和算數(shù)運(yùn)算符結(jié)合的布爾表達(dá)式示例,如果布爾表達(dá)式 i > j && m < k++
結(jié)果為真,則執(zhí)行 if
分支,k 自增 1,否則執(zhí)行 else
分支,k 自減 1,最后打印出 k 的值。由于 i
的值小于 j
,并且 &&
運(yùn)算符有短路作用,所以 m < k++
不做運(yùn)算,直接走到 else
分支,最后得到結(jié)果 k = 6
。
這里再次強(qiáng)調(diào)一下邏輯運(yùn)算符的短路:
在表達(dá)式中 (a && b)
,如果 a 為假,則 b 不會(huì)被求值,因?yàn)闊o(wú)論如何表達(dá)式都會(huì)為假。
同理,在表達(dá)式中 (a || b)
,如果 a 為真,則 b 不會(huì)被求值,因?yàn)闊o(wú)論如何表達(dá)式都會(huì)為真。
這就是我們所說(shuō)的短路。如果想要取消短路,可以使用 &
代替 &&
、使用 |
代替 ||
,但是不建議這樣寫,會(huì)降低代碼的可讀性。
試想,如果將表達(dá)式中 i > j && m < k++
的 &&
改為 &
,變量 k
的值將會(huì)是多少?
2. 語(yǔ)句
在計(jì)算機(jī)科學(xué)的編程中,一個(gè)語(yǔ)句是指令式編程語(yǔ)言中最小的獨(dú)立元素,語(yǔ)句用以表達(dá)程序要執(zhí)行的一些動(dòng)作。多數(shù)語(yǔ)句是以高級(jí)語(yǔ)言編寫成一個(gè)或多個(gè)語(yǔ)句的序列,用于命令計(jì)算機(jī)執(zhí)行指定的一系列操作。
語(yǔ)句和自然語(yǔ)言(例如英語(yǔ)、漢語(yǔ))中的句子大致相同。一條語(yǔ)句構(gòu)成了完整的執(zhí)行單元。通過(guò)使用英文分號(hào)(;
)終止表達(dá)式,可以將以下類型的表達(dá)式制成語(yǔ)句:
- 賦值表達(dá)式
- 自增 / 自減
++
或--
- 方法調(diào)用
- 對(duì)象創(chuàng)建表達(dá)式(面向?qū)ο蟛糠謱?huì)學(xué)到)
請(qǐng)結(jié)合如下示例理解語(yǔ)句的概念:
變量聲明語(yǔ)句:
int age;
賦值語(yǔ)句:
age = 20;
自增語(yǔ)句:
age ++;
方法調(diào)用語(yǔ)句:
System.out.println("Hello World! ");
3. 塊
塊通常用來(lái)將兩條或多條語(yǔ)句組合在一起,使其在格式上看更像一條語(yǔ)句。
一堆語(yǔ)句可以放在大括號(hào)中,以作為單個(gè)塊執(zhí)行??梢詾榇祟愓Z(yǔ)句命名或?yàn)槠涮峁﹫?zhí)行條件(下一節(jié)的條件判斷將會(huì)講到)。
下面是將一系列的語(yǔ)句放在一個(gè)塊中的示例代碼:
{
int a = 1;
int b = 2;
int c = 3;
int result = a + b + c;
}
4. 小結(jié)
本節(jié)我們學(xué)習(xí)了表達(dá)式,它的計(jì)算結(jié)果為單獨(dú)的值。還要特別注意前后自增 / 自減的區(qū)別,要理解邏輯運(yùn)算符在表達(dá)式中的短路作用,這在任何語(yǔ)言的基礎(chǔ)面試中都會(huì)經(jīng)??嫉健?duì)于語(yǔ)句和塊的概念,我們也有了一個(gè)初步的認(rèn)識(shí),想要完全理解這些內(nèi)容,還需要繼續(xù)向下學(xué)習(xí)更多知識(shí)。下一小節(jié)開(kāi)始,我們將學(xué)習(xí) Java 條件語(yǔ)句、循環(huán)語(yǔ)句等內(nèi)容,這些都將加深你對(duì)本節(jié)概念的理解。