C語言簡明講解三目運(yùn)算符和逗號表達(dá)式的使用
一、三目運(yùn)算符
三目運(yùn)算符( a ? b : c)可以作為邏輯運(yùn)算的載體
規(guī)則:當(dāng) a 的值為真時(shí),返回 b 的值;否則返回 c 的值
下面看一段代碼:
#include <stdio.h> int main() { int a = 1; int b = 2; int c = 0; c = a < b ? a : b; (a < b ? a : b) = 3; printf("%d\n", a); printf("%d\n", b); printf("%d\n", c); return 0; }
編譯時(shí)會(huì)發(fā)現(xiàn)報(bào)錯(cuò):
這是因?yàn)槿窟\(yùn)算符返回的是值,而不是變量,所以報(bào)錯(cuò)。
看看下面做法,將地址作為三目運(yùn)算符的返回,就可以:
#include <stdio.h> int main() { int a = 1; int b = 2; int c = 0; c = a < b ? a : b; *(a < b ? &a : &b) = 3; printf("%d\n", a); printf("%d\n", b); printf("%d\n", c); return 0; }
下面為輸出結(jié)果:
三目運(yùn)算符( a ? b : c)的返回類型
- 通過隱式類型轉(zhuǎn)換規(guī)則返回 b 和 c 中的較高類型
- 當(dāng) b 和 c 不能隱式轉(zhuǎn)換到同一類型時(shí)將編譯出錯(cuò)
下面看一段代碼,看看三目運(yùn)算符的返回類型:
#include <stdio.h> int main() { char c = 0; short s = 0; int i = 0; double d = 0; char* p = "str"; printf( "%d\n", sizeof(c ? c : s) ); printf( "%d\n", sizeof(i ? i : d) ); //printf( "%d\n", sizeof(d ? d : p) ); return 0; }
下面為輸出結(jié)果:
char 和 short 在一起,返回 int 類型,占 4 個(gè)字節(jié)。
關(guān)于 char 和 short 返回 int 類型,我的理解如下:
如果一個(gè)運(yùn)算符兩邊的運(yùn)算數(shù)類型不同,先要將其轉(zhuǎn)換為相同的類型,即較低類型轉(zhuǎn)換為較高類型,然后再參加運(yùn)算,轉(zhuǎn)換規(guī)則如下圖所示。
double ←── float 高
↑
long
↑
unsigned
↑
int ←── char,short 低
二、逗號表達(dá)式
- 逗號表達(dá)式是C語言中的“粘貼劑”
- 逗號表達(dá)式用于將多個(gè)子表達(dá)式連接為一個(gè)表達(dá)式
- 逗號表達(dá)式的值為最后一個(gè)子表達(dá)式的值
- 逗號表達(dá)式中的前 N-1 個(gè)子表達(dá)式可以沒有返回值
- 逗號表達(dá)式按照從左向右的順序計(jì)算每個(gè)子表達(dá)式的值
如下:
下面看一個(gè)逗號表達(dá)式的示例:
#include <stdio.h> void hello() { printf("Hello!\n"); } int main() { int a[3][3] = { (0, 1, 2), (3, 4, 5), (6, 7, 8) }; int i = 0; int j = 0; while( i < 5 ) printf("i = %d\n", i), hello(), i++; for(i=0; i<3; i++) { for(j=0; j<3; j++) { printf("a[%d][%d] = %d\n", i, j, a[i][j]); } } return 0; }
下面為輸出結(jié)果:
為什么打印出來的 a 數(shù)組和我們預(yù)想的不一樣呢,這是因?yàn)?/p>
int a[3][3] = {
(0, 1, 2), (3, 4, 5), (6, 7, 8)
};
里面的逗號構(gòu)成了逗號表達(dá)式,逗號表達(dá)式的值為最后一個(gè)子表達(dá)式的值,相當(dāng)于
int a[3][3] = {
2,
5,
8
};
而且,二維數(shù)組的初始化也不是那樣,而是
int a[3][3] = {
{0, 1, 2},
{3, 4, 5},
{6, 7, 8}
};
這點(diǎn)一定要注意,不要弄錯(cuò)?。?!
下面再來看一個(gè)一行代碼實(shí)現(xiàn) strlen :
#include <stdio.h> #include <assert.h> int strlen(const char* s) { return assert(s), (*s ? strlen(s + 1) + 1 : 0); } int main() { printf("len = %d\n", strlen("Autumn")); printf("len = %d\n", strlen(NULL)); return 0; }
下面為輸出結(jié)果:
三、小結(jié)
- 三目運(yùn)算符返回變量的值,而不是變量本身
- 三目運(yùn)算符通過隱式類型轉(zhuǎn)換規(guī)則確認(rèn)返回值類型
- 逗號表達(dá)式按照從左向右的順序計(jì)算每個(gè)子表達(dá)式的值
- 逗號表達(dá)式的值為最后一個(gè)子表達(dá)式的值
到此這篇關(guān)于C語言簡明講解三目運(yùn)算符和逗號表達(dá)式的使用的文章就介紹到這了,更多相關(guān)C語言 三目運(yùn)算符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
StretchBlt函數(shù)和BitBlt函數(shù)用法案例詳解
這篇文章主要介紹了StretchBlt函數(shù)和BitBlt函數(shù)用法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08C++ boost::asio編程-域名解析詳細(xì)介紹
這篇文章主要介紹了C++ boost::asio編程-域名解析詳細(xì)介紹的相關(guān)資料,這里附有實(shí)例代碼,幫助大家學(xué)習(xí)理解這部分知識,需要的朋友可以參考下2016-11-11C++實(shí)現(xiàn)不能被繼承的類實(shí)例分析
這篇文章主要介紹了C++實(shí)現(xiàn)不能被繼承的類實(shí)例分析,對于C++初學(xué)者而言可以通過本文實(shí)例更好的理解類的原理及運(yùn)用,需要的朋友可以參考下2014-08-08