C++ (Q.有点错误,请检查正文)C float*Q=NULL;printf(“f”,q);输出为0.000000,但单位为C++;float*q=nullptr;库特<&书信电报;Q给输出0?
[我的问题有点奇怪,但现在更改它是不对的,因为它得到了很好的解释,但我正在用[Update]…[Update End]标签编辑它,以避免对即将访问我的帖子的访问者造成混淆] CC++ (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*)型的 因此,格
#include<stdio.h>
int main()
{
float *q=NULL;
printf("%f\n",q);
}
- 在C中,输出为0.000000
- 那么这里q是浮点型空指针还是仍然是(void*)型空指针
- 我觉得它是(void*)型的
- 因此,格式(%f)和参数(void*)中的不匹配将调用未定义 行为并导致此类错误类型输出
#include<iostream>
int main()
{
float *q=nullptr;
std::cout<<q;
}
-
在C++中给出输出0
- 我认为这很好,因为它给出了第一个内存块的地址作为指针 毫无意义
- 如果q是nullptr_t类型,那么C++11应该给出一个错误 这里的意思是q是浮点型nullptr
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;