tft每日頭條

 > 生活

 > c語言數組必須用逗号嗎為什麼

c語言數組必須用逗号嗎為什麼

生活 更新时间:2024-06-26 07:50:16
前言

2020年9月,C 20 标準投票通過,預計年底正式發布,C 語言又迎來了重大更新。

提起 C 的新标準,其實有利有弊,有利的是新标準使 C 功能更強大了,新的語法和标準庫能夠使代碼開發更靈活高效。但帶來的弊端是語法更複雜,對開發人員的要求更高,使用不當,會導緻程序複雜難懂,并容易引入各種問題。

不管大家如何褒貶,C 20 新标準已經是既成事實了,對于 C 的使用者來說,最好是擁抱變化,揚長避短,充分發揮 C 的優勢,合理并控制使用各種語言特性,使代碼保持簡單易懂。

在這個系列文章裡,我們來分析一下 C 20 的各個新特性,不但分析新特性的作用和使用方式,也分析其設計的出發點以及帶來的影響,為大家在評估是否使用如何使用此新特性時,提供一些參考。

注意:C 20 特性需要 gcc 10 或者 Visual Studio 2019 及以上的版本才支持,本系列的例子使用gcc 10 來編譯運行。

c語言數組必須用逗号嗎為什麼(C20新特性1)1

廢棄數組下标中的逗号表達式

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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved