日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

运算符求值顺序

發布時間:2024/9/27 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 运算符求值顺序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

&&與||兩個運算符的求值順序是非常重要的,因為很多判斷語句都是基于它們擁有一定的求值順序才能正確進行的。

eg:
if((num1 != 0) && (num2 / num1 \ > num2 - num1))
上面的if()判斷語句合理的運用了&&運算符,使之不會出現0做除數的情況(num1 = 0時),因為&&運算符的求值順序是從左到右的,且它有一個特性,就是當左邊的值為假時,就不用再求右邊的值了 —->> &&:與運算符,同真為真,一假為假。
||運算符的規則與&&很相似,求值順序也是從左到右,且它有一個特性是,當左邊的值為真時,就不必再求右邊的值了—->>||:或運算符,一真為真,同假為假。

PS:這里穿插一下&& || !與& | ~的區別
前面三個叫邏輯運算符,后面三個叫按位運算符,&& || & | 四個運算符是需要兩個操作數的,!和~是只需要一個運算符的。
&&:當左邊的操作數為假時,右邊的操作數就不再求值了,因為&&運算符要求要兩個操作數都為真時表達式才為真,否則就為假。
||:當左邊的操作數為真時,右邊的操作數就不再求值了,因為||運算符要求要兩個操作數有一個為真時表達式就為真,否則才為假。
&和|都要求必須對兩個操作數都求值,否則無法計算表達式的結果。

#include<stdio.h>int main() {int num1 = 0;int num2 = 10;if ((num1 != 0) && (num2 / num1 < num2 - num1)){num1 += num2 - num1;}printf("%d\n", num1);system("pause");return 0; } #include<stdio.h>int main() {int num1 = 0;int num2 = 10;if ((num1 = 0) || (num2 / num1 < num2 - num1)){num1 += num2 - num1;}printf("%d\n", num1);system("pause");return 0; }

所以上面的兩段代碼都不會因為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,可以看出當三目運算符比較的兩個數據時相同的時,三目運算符所組成的表達式的最終值是”:”后面的數據的值

總結

以上是生活随笔為你收集整理的运算符求值顺序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。