[英]Logic of ternary operator in C?
我正在研究一些AES實現C代碼。 加密代碼需要獲取作為參數傳遞的密碼,以及加密和輸出文件。
據我所知,它會讀取密碼並對其進行處理並將其轉換為密鑰。 但是在這個循環中,我無法真正理解它在做什么。
int main(int argc, char **argv) {
unsigned long rk[RKLENGTH(KEYBITS)];
unsigned char key[KEYLENGTH(KEYBITS)];
int i;
int nrounds;
char *password;
FILE *output;
if (argc < 3) {
fputs("Missing argument\n", stderr);
return 1;
}
password = argv[1]
for (i = 0; i < sizeof(key); i++)
key[i] = *password != 0 ? *password++ : 0; /* HERE IS WHERE I CAN'T GET IT */
關鍵字符串到底發生了什么? 我認為有一些邏輯的東西和位操作。
您正在查看的循環是將password
字符串中的sizeof(key)
字節復制到key
緩沖區中,如果password
字符串的長度小於sizeof(key)
,則將緩沖區的其余部分填充為0
。
三元運算符具有以下形式:
條件
?
表達式-1:
表達式-2
如果condition為true,則計算expression-1 ,否則計算expression-2 。 存在短路,因為只評估了其中一個表達式。 所以,在你的代碼中:
key[i] = *password != 0 ? *password++ : 0;
一旦*password != 0
變為false, password
就不會再次遞增。
對於密鑰中的每個字節,如果密碼中有相應的字節(最初為argv[1]
),則將該字節復制到密鑰; 否則將0(字節)復制到密鑰。 這是一種冗長的寫作方式:
strncpy(key, password, sizeof(key));
(這也是我建議使用strncpy()
的少數幾次之一;一般情況下,它不會達到人們的期望,但在這里,它完全符合要求。)
同樣:
key[i] = *password != 0 ? *password++ : 0; /* HERE IS WHERE I CAN'T GET IT */
=
if (*password != 0) { key[i]=*password++; } else { key[i]=0; } ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.