2009-11-21 77 views
1

使用逻辑运算符size_tpid_t类型的正确方法是什么? 我的意思是:写下如下所示的内容是合法的吗?
例如: -如何比较size_t和pid_t与int

size_t sz; 
/* some kind of assignment */ 
if(sz > 0){ 
    /* do something */ 
} 

例如为:

void f(pid_t pid,...){ 
    if(pid > 0){ 
    /* do something */ 
    } 
    /* ... */ 
} 

..或者我必须做一些投?

编辑
好的答案;
现在,算什么已被告知,有人可以给我一个理由编码这样:

​​

我的老师写的代码。
它有道理吗?
我不知道为size_t类型保留了多少位(它是依赖于实现的)
但它肯定是一个无符号(你的答案),那么为什么上面的表达式呢?

+0

感谢您的编辑,我试图正确格式化 – Marco 2009-11-21 15:43:02

回答

6

是的,这是合法的。在进行比较之前,>的两个参数都将被提升为匹配类型。

请注意,对于无符号类型,如size_t,> 0表示与!= 0相同。

1

size_tpid_t真的是不同口味的整数值 - 所以是的。

从我的理解,他们背后的整个观点的确,size_tpid_t的风格可能会因实现,操作系统和体系结构(比如32位v 64位)以及不同而不同。

0

在C中,size_t是一个无符号类型,其大小是INT类型在底层体系结构上的大小。

因为C是弱类型的,你可以将有符号整数赋值给size_t类型。正确使用类型的责任部分取决于程序员。

在你的情况,因为你正在比较size_t类型为零它很好。尝试将其与负数进行比较。你会感到惊讶。

0

有一个在你只要记住,int值将被隐式转换为无符号类型比较一个size_t值与int值没有问题(因为size_t是无符号)。

由于上述原因,有些编译器会在比较中混合使用带符号和无符号类型时发出警告。在这种情况下,为了抑制警告,您必须将有符号值显式转换为适当的无符号类型。但是,当有符号值是非负的编译时常量时,这些编译器通常不会发出任何警告,这意味着在您的示例中不需要将明确的0转换为无符号类型(或使用0U)。