2020年9月,C 20 标準投票通過,預計年底正式發布,C 語言又迎來了重大更新。
提起 C 的新标準,其實有利有弊,有利的是新标準使 C 功能更強大了,新的語法和标準庫能夠使代碼開發更靈活高效。但帶來的弊端是語法更複雜,對開發人員的要求更高,使用不當,會導緻程序複雜難懂,并容易引入各種問題。
不管大家如何褒貶,C 20 新标準已經是既成事實了,對于 C 的使用者來說,最好是擁抱變化,揚長避短,充分發揮 C 的優勢,合理并控制使用各種語言特性,使代碼保持簡單易懂。
在這個系列文章裡,我們來分析一下 C 20 的各個新特性,不但分析新特性的作用和使用方式,也分析其設計的出發點以及帶來的影響,為大家在評估是否使用如何使用此新特性時,提供一些參考。
注意:C 20 特性需要 gcc 10 或者 Visual Studio 2019 及以上的版本才支持,本系列的例子使用gcc 10 來編譯運行。
廢棄數組下标中的逗号表達式
C 20 中的一個改動,是廢棄了在數組中直接使用逗号表達式作為下标,例如下面的代碼:
#include <iostream>
bool change( int & x ) { x = x * 2; return true; }
int main( int argc, char * argv[] )
{
int arr[10] = { 0 };
int x = 3;
arr[ change( x ), x ] = 3; // (1)
arr[ ( x = 1, x 1 ) ] = 4; // (2)
for( x = 0; x < 10; x )
std::cout << x << " : " << arr[x] << std::endl;
return 0;
}
其中(1)處的代碼,就是直接使用逗号表達式作為數組的下标,這樣的代碼在 C 17 及以前的标準中是正常的代碼,但到了 C 20 中就成了廢棄的代碼,編譯結果如下:
[foo@test code]$ g -std=c 17 a1.cpp
[foo@test code]$ g -std=c 20 a1.cpp
a1.cpp: In function ‘int main(int, char**)’:
a1.cpp:7:18: warning: top-level comma expression in array subscript is deprecated [-Wcomma-subscript]
7 | arr[ change( x ), x ] = 3; // (1)
| ^
[foo@test code]$ ./a.out
0 : 0
1 : 0
2 : 0
3 : 0
4 : 0
5 : 0
6 : 3
7 : 0
8 : 4
9 : 0
C 20 的這個修改,主要的目的,是為了以後可以支持通過多個下标訪問多維數組,當然這個多維數組不是 C 語言的多維數組,而是類的形式的多維數組,通過重載 operator [ ] 來實現多個下标參數的訪問方式。而當前重載 operator [ ] 隻支持一個參數。
// 将來可能可以支持類似下面的語法,定義多維數組類,通過多個下标來訪問多維數組元素
mdspan<int, array_property::dimension<2, 3, 5>> foo( /*...*/ );
int value = foo[1, 2, 3];
當然這個隻是未來的設想,涉及到可能不兼容的改動,可能需要比較長的過渡時間。而廢棄在數組中直接使用逗号表達式作為下标隻是邁出開始的一步。不過也有可能 C 标準委員會縮短這個過渡時間,更積極的擁抱變化。C 标準的更新速度比以前更快了,從 auto關鍵字含義的改變來看,可能這種不兼容的修改其實比我們想象中更容易被接受并廣泛使用。
對于當前的代碼來說,如果确實需要在數組下标中使用逗号表達式,可以使用(2)處代碼的寫法,加一個括号,可以避免直接使用逗号表達式,提高代碼的兼容性。
arr[ change( x ), x ] = 3; // (1)
arr[ ( x = 1, x 1 ) ] = 4; // (2)
逗号運算符有時候在寫緊湊一些的代碼時比較方便,例如上面調用函數修改一個值時,函數并不返回這個值,可以通過逗号運算符來指定使用這個值。但由于逗号本身也可以用來分隔變量定義、函數參數等,這樣就有可能出現二義性。所以如果在一些有可能出現二義性的場合,多加一個括号可以避免潛在的問題。
其實有時候緊湊的代碼雖然行數少了,但不一定簡潔易懂,還不如拆開成多行,例如:
change( x );
arr[ x ] = 3; // (1)
x = 1;
arr[ x 1 ] = 4; // (2)
這樣的代碼雖然行數多了,但更有利于代碼的閱讀和理解,畢竟代碼一般都是需要持續維護的,閱讀這段代碼的時間比寫這段代碼的時間長的多,是值得我們多花一點心思,使我們的代碼更容易閱讀,更容易理解。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!