C語言簡明講解三目運(yùn)算符和逗號(hào)表達(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 低
二、逗號(hào)表達(dá)式
- 逗號(hào)表達(dá)式是C語言中的“粘貼劑”
- 逗號(hào)表達(dá)式用于將多個(gè)子表達(dá)式連接為一個(gè)表達(dá)式
- 逗號(hào)表達(dá)式的值為最后一個(gè)子表達(dá)式的值
- 逗號(hào)表達(dá)式中的前 N-1 個(gè)子表達(dá)式可以沒有返回值
- 逗號(hào)表達(dá)式按照從左向右的順序計(jì)算每個(gè)子表達(dá)式的值
如下:

下面看一個(gè)逗號(hào)表達(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)
};
里面的逗號(hào)構(gòu)成了逗號(hào)表達(dá)式,逗號(hào)表達(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ò)?。。?/p>
下面再來看一個(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)返回值類型
- 逗號(hào)表達(dá)式按照從左向右的順序計(jì)算每個(gè)子表達(dá)式的值
- 逗號(hào)表達(dá)式的值為最后一個(gè)子表達(dá)式的值
到此這篇關(guān)于C語言簡明講解三目運(yùn)算符和逗號(hào)表達(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-08
C++ boost::asio編程-域名解析詳細(xì)介紹
這篇文章主要介紹了C++ boost::asio編程-域名解析詳細(xì)介紹的相關(guān)資料,這里附有實(shí)例代碼,幫助大家學(xué)習(xí)理解這部分知識(shí),需要的朋友可以參考下2016-11-11
C++實(shí)現(xiàn)不能被繼承的類實(shí)例分析
這篇文章主要介紹了C++實(shí)現(xiàn)不能被繼承的類實(shí)例分析,對于C++初學(xué)者而言可以通過本文實(shí)例更好的理解類的原理及運(yùn)用,需要的朋友可以參考下2014-08-08

