gpt4 book ai didi

c++ - 三元运算符的指针转换问题

转载 作者:IT老高 更新时间:2023-10-28 21:51:12 29 4
gpt4 key购买 nike

我知道三元运算符有一些令人惊讶的限制,但我有点困惑,这无法为我编译:

void foo(bool b)
{
int* ptr = ((b) ? NULL : NULL);
}

显然,这是显示问题所需的最低要求。错误是:

[BCC32 Error] Unit11.cpp(20): E2034 Cannot convert 'int' to 'int *'

编译器是低于 100% 的 Embarcadero C++Builder 2010,因此编译器错误远非不可能......

注意:修改括号以避免混淆我的意图。

NOTE2:我对自己最初是如何得出这个结构有点困惑,所以这是我的借口:我在像 a = b? 这样的行上遇到了一些编译错误? c : d,其中 b、c 和 d 都是复杂表达式。为了缩小范围,我将 cd 替换为 NULL 以检查 b 是否是罪魁祸首.在这一点上,一切都在手推车里一败涂地。

最佳答案

NULL 是一个扩展为 0 的宏(或一些值为 0 的整数常量表达式,例如 (1 - 1))。它不是“特别的”。

任何值为 0 的整型常量表达式都可用作空指针常量,这就是允许 int* ptr = 0; 的原因。但是,这里的表达式是 b ? 0 : 0;这不是一个整数常量表达式(b 不是常量);它的类型是int,不能隐式转换为int*

解决方法是明确指定您需要一个指针类型:

int* const null_int_ptr = 0;
int* ptr = b ? null_int_ptr : null_int_ptr;

这个例子有点做作:通常当使用条件运算符时,至少有一个参数实际上是指针类型(例如 b ? ptr : 0);当其中一个操作数是指针类型时,0 被隐式转换为相同的指针类型,因此整个条件表达式的类型是指针类型,而不是 int .

唯一可能遇到此“问题”的情况是空指针常量同时用作条件运算符的第二个和第三个操作数,这很奇怪。

关于c++ - 三元运算符的指针转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6819642/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com