运算符求值顺序
&&與||兩個運算符的求值順序是非常重要的,因為很多判斷語句都是基于它們擁有一定的求值順序才能正確進行的。
eg:
if((num1 != 0) && (num2 / num1 \ > num2 - num1))
上面的if()判斷語句合理的運用了&&運算符,使之不會出現0做除數的情況(num1 = 0時),因為&&運算符的求值順序是從左到右的,且它有一個特性,就是當左邊的值為假時,就不用再求右邊的值了 —->> &&:與運算符,同真為真,一假為假。
||運算符的規則與&&很相似,求值順序也是從左到右,且它有一個特性是,當左邊的值為真時,就不必再求右邊的值了—->>||:或運算符,一真為真,同假為假。
PS:這里穿插一下&& || !與& | ~的區別
前面三個叫邏輯運算符,后面三個叫按位運算符,&& || & | 四個運算符是需要兩個操作數的,!和~是只需要一個運算符的。
&&:當左邊的操作數為假時,右邊的操作數就不再求值了,因為&&運算符要求要兩個操作數都為真時表達式才為真,否則就為假。
||:當左邊的操作數為真時,右邊的操作數就不再求值了,因為||運算符要求要兩個操作數有一個為真時表達式就為真,否則才為假。
&和|都要求必須對兩個操作數都求值,否則無法計算表達式的結果。
所以上面的兩段代碼都不會因為num = 0時,num2會除 0 而報錯,盡量兩段代碼的輸出是不相同的。
#include<stdio.h>int main() {int num = (1, 2, 3, 4, 5);printf("%d\n", num);system("pause");return 0; }上面這段代碼的輸出值為
5
,這就驗證了逗號運算符的結果是最右邊的值,特別要注意,函數參數之間的分隔符,并不是逗號表達式,它就是一個分隔符。
因為其它運算符是沒有求值順序的,所以不能自己臆想它們的求值順序來方便自己的編程
#include<stdio.h>int main() {int arr[10] = { 0 };int i = 0;for (i = 0; i < sizeof(arr) / sizeof(arr[0]);){arr[i++] = i;}for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d\n", arr[i]);}system("pause");return 0; } #include<stdio.h>int main() {int arr[10] = { 0 };int i = 0;for (i = 0; i < sizeof(arr) / sizeof(arr[0]);){arr[i] = i++;}for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d\n", arr[i]);}system("pause");return 0; }上面兩段代碼盡管都能輸出想要的結果,但是它的邏輯卻是不嚴謹的,因為arr[i] = i++和arr[i++] = i這兩個語句有漏洞。那arr[i] = i++來說,賦值運算符(=)的求值順序是不確定的,那么不知道是先算i++,然后arr[i]中的i是進入循環時的i自增之后的值,還是先確定arr[i]中i的值就是進入循環時i的值,然后再進行i++操作。
基于這種不確定性,這兩段代碼都不是正確的代碼。
可以改為
#include<stdio.h>int main() {int arr[10] = { 0 };int i = 0;for (i = 0; i < sizeof(arr) / sizeof(arr[0]);){arr[i] = i;i++;}for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d\n", arr[i]);}system("pause");return 0; }或者
#include<stdio.h>int main() {int arr[10] = { 0 };int i = 0;for (i = 0; i < sizeof(arr) / sizeof(arr[0]);i++){arr[i] = i;}for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d\n", arr[i]);}system("pause");return 0; }最后介紹C語言里的唯一一種三目運算符 —->> ?:
用一個實例來說明:
a = 10;
b = 20;
int num = a > b ? a : b;
三目運算符的規則是,先求a > b 成立的話,num = a。不成立的話,num = b。
但是,當上述 a = b時該怎么解決呢?
#include <stdio.h>int main() {int a = 10;int b = 10;int num = a > b ? a + 10 : b + 20;//int num = a < b ? a + 10 : b + 20;//當三目運算符比較的兩個數據時相同的時,三目運算符所組成的表達式的最終值是":"后面的數據的值printf("%d\n", num);system("pause");return 0; }輸出為30,可以看出當三目運算符比較的兩個數據時相同的時,三目運算符所組成的表達式的最終值是”:”后面的數據的值
總結
- 上一篇: php加大session,PHP ::
- 下一篇: 服务器修改用户组权限设置,如何:修改用户