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