iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0

倒數三天了~~~

今天的主題是介紹一些奇怪的C、C++語法。

陣列

眾所週知,要取得a陣列的第i格要寫a[i],但其實a[i]是語法糖,他在編譯時會被解析成*(a+i)來做判斷喔。

依據阿貝爾群 :a[i] = *(a+i) = *(i+a) = i[a]

沒錯,其實在C跟C++的陣列,你就算寫i[a]也是可以取得a陣列第i格的值喔!

「趨近於」運算子:-->

int n=10;
while(n-->0){
	cout<<n<<endl;
}

只要使用「趨近於」運算子,就可以實現迴圈的時候每圈讓n慢慢的趨近於0喔!

才怪咧,其實並沒有這麼奇怪的運算子,他其實就是while(n-- >0)喔。

只是每圈都執行一個n--而已啦。

#define 函式

define是可以做到類似函式的設計喔,可以做到很簡單的範型的感覺

#define max(a,b) ((a)>(b)?(a):(b))

要注意小括弧要記得加,因為define是用展開的,如果不加的話,展開可能會形成語意問題。

#x

在寫#define的時候,可以善用#這個酷酷的語法,他可以把他當成某種格式化字串的概念來使用,我不太會解釋,所以我們直接看程式碼吧!

#include<iostream>
using namespace std;

#define debug(x) cout<<#x<<":"<<x<<endl;

int main(){
	int i = 10;
	debug(i);
	return 0;
}

這段程式碼的輸出結果是

i:10

#x的部分會被直接用debug()中的那個「i」給代替喔!

遍歷輸出陣列

for(int i-0;i<n;i++){
	cout<<a[i]<<" \n"[i==n-1];
}

這個前幾天的文章就已經出現了,但真的是很有趣的語法,很推薦大家學會。

編譯期運算constexpr

C++有一個函式的修飾詞是constexpr,如果一開始傳入的就是常數,他可以在編譯時就進行運算。

constexpr unsigned int fib(int n)noexcept{
    return ( n == 0 || n == 1 ? n : fib( n - 1 ) + fib( n - 2 ) );
}

假設呼叫時是 fib(13),他會直接在編譯時就算出答案,程式執行當下就可以O(1)喔!

(但其實要能被constexpr的函式要求還滿多的,像是不能有判斷式,要是一行句子之類的,所以使用前還是要去查一下用法,不是把你原本的函式加個constexpr就能解決。)

「航天飛機」運算子:<=>

在C++中我們是可以重載類別的運算子的,但有時候在小於等於那邊總會寫的非常尷尬,因為邏輯幾乎差不多,很常會寫成這種東西。

class Obj{
public:
	bool operator<(Obj o)const{
		//實作小於判斷
	}
	bool operator!=(Obj o)const{
		return *this<o || *this>o;
	}
	bool operator>(Obj o)const{return *this<o;}
	bool operator<=(Obj o)const{return !(*this<o);}
	bool operator>=(Obj o)const{return !(*this>o);}
	bool operator==(Obj o)const{return !(*this!=o);}
};

看起來有點繁雜對吧。

在C++20,他提供了一個不是真正的運算子讓我們重載,可以把這些邏輯全部整理在一起。

class Obj{
public:
	std::strong_ordering operator<=>(Obj o)const{
		if(小於){
			return -1;
		}
		else if(等於){
			return 0;
		}
		else{
			return 1;
		}
	}
};

你只要這樣寫,他就會自動幫你切出<、>、<=、>=、==、!=(請注意,他不是真正的運算子,你不能直接使用<=>來用,他只是幫助你一次宣告上述幾個運算子的語法糖而已)

a^=b^=a^=b;

這是一句酷酷的語法,利用xor的特性,可以做到沒有多餘變數的情況下,把兩個變數存的值交換(注意,需要是真的可以被xor運算的型態,比如int)。

else if其實不是語法?

他是

if{}
else {
    if{}
    else{}
}

因為裡面那組判斷算作一行
所以else的大括弧可以省略
變成

if{}
else
    if{}
    else{}

然後排版後變成

if{}
else if{}
else{}

然後就被當成一種語法來使用了

總結

這些都是很有趣的語法,有些可能在其他語言上也有類似的實踐。

大家可以去玩玩看喔!

本期meme

https://ithelp.ithome.com.tw/upload/images/20231012/201335741KgBFs5Dmv.png


上一篇
Day27 最好的前端框架
下一篇
Day29 JavaScript大法好
系列文
寫程式的那些宗教戰爭30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ReccaChao
iT邦研究生 5 級 ‧ 2023-10-13 11:15:21

補充個,PHP 是內建航天飛機運算子的
https://www.php.net/manual/zh/language.operators.comparison.php

櫛風 iT邦新手 4 級 ‧ 2023-10-13 23:02:54 檢舉

喔喔喔!原來如此

我要留言

立即登入留言