簡體   English   中英

C中三元運算符的邏輯?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM