考虑以下代码:
#define SZIE 1024 printf("%\zu",SZIE<-1?1:0);
它将打印“0”。这让我很困惑。在我看来,有符号数-1应该转换为SIZE_MAX。表达式1024 < SIZE_MAX为true,所以我认为应该打印“1”,但不是。我尝试了显式转换:
-1
SIZE_MAX
1024 < SIZE_MAX
printf("%zu",SIZE<(size_t)-1?1:0);
它打印“1”,这似乎是正确的。
iezvtpos1#
你定义了一个宏SZIE(我想你的意思是SIZE),用于类型为int的整数常量1024。
SZIE
SIZE
int
1024
#define SZIE 1024
所以1024不小于-1。此外,由于操作数的类型为int,那么条件运算符的结果也是int,因此在调用printf时需要使用转换说明符d而不是zu。格式字符串中似乎有一个错别字\z
d
zu
\z
printf("%\zu",SZIE<-1?1:0);
那就是你要写
printf("%d\n",SZIE<-1?1:0);
如果你需要得到预期的结果,你可以写例如
printf("%d\n",( size_t )SZIE<-1?1:0);
或者引入一个unsigned int类型的常量就足够了,如
unsigned int
#define SZIE 1024u
然后写
在这种情况下,由于通常的算术转换,具有int类型的表达式-1将被转换为unsigned int类型,产生一个大的无符号值。请注意,与条件运算符的条件表达式无关,它的结果在任何情况下都具有int类型,因为第二个和第三个操作数具有int类型。条件表达式本身的类型为int,并产生0或1。
0
1
oyxsuwqo2#
1024、-1和0都是int s,因此运算符的结果应该是0,因为1020 < -1是false,因此选择 false 值。当您执行(size_t) -1并将int转换为无符号类型时,它将获得size_t可能的最大值-大于1024,因此选择 truth 值1。注意,%zu在这两种情况下都是错误的,因为1和0仍然是int s,所以运算符的 type 是int,因此应该使用%d来打印结果。
1020 < -1
false
(size_t) -1
size_t
%zu
%d
23c0lvtd3#
printf("%d\n",SZIE<-1?1:0);等于
if(SZIE < -1) printf("%d\n", 1); else printf("%d\n", 0);
由于SZIE是1024,因此将执行if的else部分。一般terry操作符:
if
else
(condition) ? (value_if_condition_is_true) : (value_if_condition_is_false)
PS您的printf字符串是错误的。
printf
3条答案
按热度按时间iezvtpos1#
你定义了一个宏
SZIE
(我想你的意思是SIZE
),用于类型为int
的整数常量1024
。所以
1024
不小于-1
。此外,由于操作数的类型为
int
,那么条件运算符的结果也是int
,因此在调用printf时需要使用转换说明符d
而不是zu
。格式字符串中似乎有一个错别字\z
那就是你要写
如果你需要得到预期的结果,你可以写例如
或者引入一个
unsigned int
类型的常量就足够了,如然后写
在这种情况下,由于通常的算术转换,具有
int
类型的表达式-1
将被转换为unsigned int
类型,产生一个大的无符号值。请注意,与条件运算符的条件表达式无关,它的结果在任何情况下都具有
int
类型,因为第二个和第三个操作数具有int
类型。条件表达式本身的类型为int
,并产生0
或1
。oyxsuwqo2#
1024
、-1
和0
都是int
s,因此运算符的结果应该是0
,因为1020 < -1
是false
,因此选择 false 值。当您执行
(size_t) -1
并将int
转换为无符号类型时,它将获得size_t
可能的最大值-大于1024
,因此选择 truth 值1
。注意,
%zu
在这两种情况下都是错误的,因为1
和0
仍然是int
s,所以运算符的 type 是int
,因此应该使用%d
来打印结果。23c0lvtd3#
printf("%d\n",SZIE<-1?1:0);
等于由于
SZIE
是1024,因此将执行if
的else
部分。一般terry操作符:
PS您的
printf
字符串是错误的。