繁体   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