关于C三元运算符返回值的初学者问题

yeotifhr  于 2023-05-16  发布在  其他
关注(0)|答案(3)|浏览(94)

考虑以下代码:

#define SZIE 1024

printf("%\zu",SZIE<-1?1:0);

它将打印“0”。这让我很困惑。
在我看来,有符号数-1应该转换为SIZE_MAX。表达式1024 < SIZE_MAX为true,所以我认为应该打印“1”,但不是。
我尝试了显式转换:

printf("%zu",SIZE<(size_t)-1?1:0);

它打印“1”,这似乎是正确的。

iezvtpos

iezvtpos1#

你定义了一个宏SZIE(我想你的意思是SIZE),用于类型为int的整数常量1024

#define SZIE 1024

所以1024不小于-1
此外,由于操作数的类型为int,那么条件运算符的结果也是int,因此在调用printf时需要使用转换说明符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类型的常量就足够了,如

#define SZIE 1024u

然后写

printf("%d\n",SZIE<-1?1:0);

在这种情况下,由于通常的算术转换,具有int类型的表达式-1将被转换为unsigned int类型,产生一个大的无符号值。
请注意,与条件运算符的条件表达式无关,它的结果在任何情况下都具有int类型,因为第二个和第三个操作数具有int类型。条件表达式本身的类型为int,并产生01

oyxsuwqo

oyxsuwqo2#

1024-10都是int s,因此运算符的结果应该是0,因为1020 < -1false,因此选择 false 值。
当您执行(size_t) -1并将int转换为无符号类型时,它将获得size_t可能的最大值-大于1024,因此选择 truth1
注意,%zu在这两种情况下都是错误的,因为10仍然是int s,所以运算符的 typeint,因此应该使用%d来打印结果。

23c0lvtd

23c0lvtd3#

printf("%d\n",SZIE<-1?1:0);等于

if(SZIE < -1) printf("%d\n", 1);
else printf("%d\n", 0);

由于SZIE是1024,因此将执行ifelse部分。
一般terry操作符:

(condition) ? (value_if_condition_is_true) : (value_if_condition_is_false)

PS您的printf字符串是错误的。

相关问题