C++ (Q.有点错误,请检查正文)C float*Q=NULL;printf(“f”,q);输出为0.000000,但单位为C++;float*q=nullptr;库特<&书信电报;Q给输出0?

C++ (Q.有点错误,请检查正文)C float*Q=NULL;printf(“f”,q);输出为0.000000,但单位为C++;float*q=nullptr;库特<&书信电报;Q给输出0?,c++,c,null,floating-point,nullptr,C++,C,Null,Floating Point,Nullptr,[我的问题有点奇怪,但现在更改它是不对的,因为它得到了很好的解释,但我正在用[Update]…[Update End]标签编辑它,以避免对即将访问我的帖子的访问者造成混淆] C #include<stdio.h> int main() { float *q=NULL; printf("%f\n",q); } 在C中,输出为0.000000 那么这里q是浮点型空指针还是仍然是(void*)型空指针 我觉得它是(void*)型的 因此,格

[我的问题有点奇怪,但现在更改它是不对的,因为它得到了很好的解释,但我正在用[Update]…[Update End]标签编辑它,以避免对即将访问我的帖子的访问者造成混淆]

C

#include<stdio.h>
int main()
{
    float *q=NULL;
    
    printf("%f\n",q);
}
  • 在C中,输出为0.000000
  • 那么这里q是浮点型空指针还是仍然是(void*)型空指针
  • 我觉得它是(void*)型的
  • 因此,格式(%f)和参数(void*)中的不匹配将调用未定义 行为并导致此类错误类型输出
[更新]但你会回答我自己的问题,我问了这么愚蠢的问题

基本上,我很困惑,我觉得我必须打印浮动类型或无效类型的内容,但问题是我正在打印地址,所以使用%f来打印地址是愚蠢的

很明显,q是浮点型指针,只是我觉得完全错了

通常,我们使用%u打印任何类型变量(int、char、float)的地址,但对于指针,我们应该使用%p

[更新结束]

C++

#include<iostream>
int main()
{
    float *q=nullptr;
    std::cout<<q;
}
    在C++中给出输出0
  • 我认为这很好,因为它给出了第一个内存块的地址作为指针 毫无意义
  • 如果q是nullptr_t类型,那么C++11应该给出一个错误 这里的意思是q是浮点型nullptr
[更新]

< > C和C++标准都指定空指针常数等于0,它们不表示该地址是什么。

显然,q只是浮点型的nullptr

[更新结束]

如果我的两个假设都是正确的,那么为什么在C++ NulLPTR中,它的类型从NulpTrpt转换为浮点类型,而在C null中,它的类型不是从(空)到(浮点)< /强> < /p>。 [更新]

在C的第一个示例中,我的第一个假设q是(void*)类型,这已经是错误的了 第二的假设是,在第二的C++中,q是nulpprtt也是错误的。 总结一下

我试图比较C中发生的事情,这是C++发生的,我觉得这些事情互相矛盾。 但实际上,在C语言中,我使用%f来打印指针的地址,这是第一个错误。在C++代码中,除了一个错误的假设,空指针指向第一块内存,这是错误的,因为它在C标准中没有指定零,它只是说当评估时NulpPTR常数与0比较。 所以很多问题都是错误,所以这不是一个恰当的问题

[更新结束]

格式说明符%f要求传递对象的类型为
double
float
参数将被隐式转换,因此也可以)。您传递了一个类型错误的
float*
。将错误类型的参数传递到
printf
会导致未定义的行为

这一个稍微微妙一些,但是%p说明符要求参数的类型为
void*
float*
仍然是错误的类型,因此行为仍然没有定义

在使用正确的格式说明符和参数类型时,应该更加小心。C格式的I/oapi是非常不可原谅的


在C++中给出输出0

请注意,是否获得0或其他输出取决于系统用于表示空指针的值

<>为什么在C++ nulpPTR中,从nulppRtIt

将类型转换为浮点类型
nullptr
在您的示例中从未“将其类型更改为浮点类型”。在
float*q=nullptr
中,隐式转换为类型
float*

但在C中,NULL并没有将其类型从(void)更改为(float)

在C语言中,
NULL
宏的类型不是
void
。它可以是整数常量0,也可以是转换为
void*
的此类常量。这两种类型都可以隐式转换为任何指针类型。这就是
float*q=NULL
中发生的情况

因此,在这两种语言中,您都隐式地将null转换为指针类型


无论哪些类型可以隐式转换为哪些类型,变量参数都不会隐式转换为格式字符串所需的类型,因为编译器1 2不知道这些类型

1有我提到的从float到double的转换,但这些转换并不依赖于格式说明符


2如果格式字符串为常量,则某些编译器确实可以帮助诊断错误,但不需要这样做。

指针没有改变类型。在cout版本中,让系统自然打印指针值。在printf版本中,您强制使用%f。将格式字符串更改为%ld,您将得到不同的结果

printf对作为参数传递的内容一无所知。它相信程序员知道他在做什么

---编辑此处以回答更多问题---

你说得对,%lu可能比%ld好。我想您可能有一个设置了最高有效位的地址(这意味着%ld会认为它是负数)

是的:

表示
q
均为零

无法知道正在打印什么,并且(通常)做正确的事情。除非您特别控制格式说明符,否则很少使用格式说明符(如打印浮点数和双位数时使用的位数)。我使用它将bools的默认输出设置为打印
true
false
,而不是
1
0
。但一般来说,在使用cout时,您可以获得合理的值,而无需进行任何额外的工作或思考。

printf(“%f\n”,q)是C语言中未定义的行为。你在对
p撒谎
#include<iostream>
int main()
{
    float *q=nullptr;
    std::cout<<q;
}
0
printf("%f\n",q);
printf("%p",q);
float * q = nullptr;