使用size_t
和pid_t
类型的逻辑运算符的正确方法是什么?
我的意思是:写下以下内容是合法的吗?
e.g:
size_t sz;
/* some kind of assignment */
if(sz > 0){
/* do something */
}
e.g:
void f(pid_t pid,...){
if(pid > 0){
/* do something */
}
/* ... */
}
..或者我必须做一些演员?
修改
好的答案;
现在,考虑到被告知的事情,有人可以给我一个编码的理由:
void *my_malloc(size_t size){
if(size <= 0){
return NULL;
}
/* something else... */
}
我的老师写了那段代码
它有意义吗?
我不知道为size_t
类型保留了多少位(它依赖于实现)
但肯定是一个未签名的(你的答案),为什么上面这个表达?
答案 0 :(得分:6)
是的,这是合法的。在进行比较之前,>
的两个参数都将被提升为匹配类型。
请注意,对于size_t
等无符号类型,> 0
表示与!= 0
相同。
答案 1 :(得分:1)
size_t
和pid_t
实际上是不同风格的整数值 - 所以是的。
据我所知,实际上,它们背后的重点是size_t
和pid_t
的风格可能在实现,操作系统和体系结构(例如,32位v 64位)和诸如此类的东西。
答案 2 :(得分:0)
在C中,size_t是无符号类型,其大小是int类型在底层架构上的大小。
因为C是弱类型的,所以你可以将有符号整数赋给size_t类型。正确使用类型的责任部分取决于程序员。
在您的情况下,因为您将size_t类型与零进行比较,所以很好。尝试将其与负数进行比较。你会感到惊讶。
答案 3 :(得分:0)
只要您记住size_t
值将隐式转换为无符号类型(从int
开始,将int
值与size_t
值进行比较就没有问题是未签名的。)
由于上述原因,当您在比较中混合使用有符号和无符号类型时,某些编译器会发出警告。在这种情况下,为了抑制警告,您必须将签名值显式转换为适当的无符号类型。但是,当签名值是非负编译时常量时,这些编译器通常不会发出任何警告,这意味着在您的示例中,不需要将显式0
转换为无符号类型(或使用{{ 1}})。