下面是一段代码。有人能解释一下最后三句脏话吗。我以前从未见过这种语法。我不知道那里发生了什么。这是其他东西的简写吗?
我将代码包含在三个bool语句之上,以提供一些上下文。
void *bob;
void *tod;
void *jon;
pthread_t *thrdA= malloc(9 * sizeof(pthread_t));
pthread_t *thrdB= malloc(9 * sizeof(pthread_t));
pthread_t *thrdC = malloc(9 * sizeof(pthread_t));
for(int i = 0; i<9; i++) {
pthread_create(&thrdA[i], NULL, FUNCT1, (void*)SAS);
}
for(int i = 0; i<9; i++) {
pthread_create(&thrdB[i], NULL, FUNCT2, (void*)SAS);
}
int x= 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
pthread_create(&thrdC[x], NULL, FUNCT3, (void*)SAS);
x++;
}
}
for(int i=0; i<9; i++) {
pthread_join(thrdA[i], &bob);
pthread_join(thrdB[i], &tod);
pthread_join(thrdC[i], &jon);
}
bool x = (unsigned long)bob== 0;
bool z = (unsigned long)tod== 0;
bool y = (unsigned long)jon== 0;
我们必须查看线程回调才能确定,但这听起来像是通过转换到void*
来按值传递整数的可疑代码。
由于pthread回调获取void*
并返回void*
,因此显然有很多奇怪的想法,即这些空指针也可以用于按值传递整数。也就是说,向void*
强制转换一个整数,而不是将指针指向已分配的对象。
当我们还处于32位PC时代时,这种脆弱的黑客可能是幸运的。如今,当x86_64指针通常是64位,但int
仍然是32位时,情况就不那么糟了。
如果有问题的代码使用了这样的技巧,那么这就解释了unsigned long
的奇怪且似乎毫无意义的转换。
不要使用这种糟糕的技巧。
关于表达式本身:bob == 0
,这是一个简单的布尔运算。将等式/关系运算符的结果分配给bool
变量是完全可以的。在实践中,这些运算符的返回类型在C中是int
(与C++不同(,但不管怎样,该返回类型都可以安全地视为bool
类型。
请记住,必须包含stdbool.h才能使用bool
——在C中,这只是实际布尔关键字_Bool
的宏。
double等于==
是一个布尔运算符,例如。
if (x==0)
- 如果x为零,则该语句的求值结果为true
- 否则该语句将被评估为false
换句话说,就好像你说了
if true
或if false
一些C编译器会识别bool语句,因为它只是一个宏(https://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html)。
因此,正如Alex F所说:x、 y和z的类型为bool(它们将被识别为true或false(。引用Alex F的话:如果bob==0,x=true,否则x=false
(无符号长(是一种类型种姓