当前位置: 首页 > 知识库问答 >
问题:

在C中浮点*Q=NULL;printf(“%f”,q);输出为0.000000,但在C++中float*Q=nullptr;COUT

佴波鸿
2023-03-14

c

#include<stdio.h>
int main()
{
    float *q=NULL;
    
    printf("%f\n",q);
    printf("%p",q);
}

输出

0.000000
0000000000000000
  • 在C中输出为0.000000
  • 所以这里q是浮点类型的空指针,还是q是(void*)类型的空指针?
  • 我觉得它是(void*)类型的。
  • 因此格式(%f)和参数(void*)不匹配将调用未定义的行为,并导致此类错误类型输出

printf(“%p”,q);

包含此语句是因为%p是NULL的格式说明符,没有其他原因

C++

#include<iostream>
int main()
{
    float *q=nullptr;
    std::cout<<q;
}

输出

0
  • 在C++中给出输出0
  • 我认为它很好,因为它给出的第一个内存块的地址没有指向任何东西
  • 如果q是nullptr_t类型,那么C++11应该给出ambugity错误表示,这里q是float类型nullptr。

所以,如果我的两个假设都是正确的,那么为什么在C++中nullptr将它的类型从nullptr_t改为float类型,而在C中NULL没有将它的类型从(void)改为(float)?

共有2个答案

高泳
2023-03-14
printf("%f\n",q);

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

printf("%p",q);

这个比较微妙,但是%p说明符要求参数的类型为void*float*仍然是错误的类型,因此行为仍未定义。

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

在C++中给出输出0

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

为什么C++中的nullptr将其类型从nullptr_t改为float类型

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

但在C中,NULL不是将它的类型从(void)改为(float)吗?

null宏的类型不是C.中的void。它可以是一个整数常量0,或者这样的常量转换为void*。这两种类型都可以隐式转换为任何指针类型。这就是float*q=null中发生的情况。

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

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

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

2如果格式字符串为常量,则某些编译器会帮助诊断错误,但不要求它们这样做。

吴开宇
2023-03-14

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

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

 类似资料:
  • Q

    Q-Learning 决策 假设我们的行为准则已经学习好了, 现在我们处于状态s1, 我在写作业, 我有两个行为 a1, a2, 分别是看电视和写作业, 根据我的经验, 在这种 s1 状态下, a2 写作业 带来的潜在奖励要比 a1 看电视高, 这里的潜在奖励我们可以用一个有关于 s 和 a 的 Q 表格代替, 在我的记忆Q表格中, Q(s1, a1)=-2 要小于 Q(s1, a2)=1, 所以

  • q

    描述 (Description) 可以使用此函数代替单引号。 这不是一个真正的函数,更像是一个运算符,但如果你在另一个程序员的程序中看到它而不记住它是什么,你可能会看到这里。 您实际上可以使用任何一组分隔符,而不仅仅是括号。 语法 (Syntax) 以下是此函数的简单语法 - q ( string ) 返回值 (Return Value) 此函数返回单引号字符串。 例子 (Example) 以下

  • 本文向大家介绍PrologCLP(Q),包括了PrologCLP(Q)的使用技巧和注意事项,需要的朋友参考一下 示例 CLP(Q)对有理数进行推理。 例:            

  • Q&A

    1. Q&A

  • Kdb +带有内置的编程语言,即q 。 它包含标准SQL的超集,可扩展用于时间序列分析,并提供许多优于标准版本的优势。 熟悉SQL的人可以在几天内学习q并能够快速编写自己的即席查询。 启动“q”环境 要开始使用kdb +,您需要启动q会话。 启动q会话有三种方法 - 只需在运行终端上输入“c:/q/w32/q.exe”即可。 启动MS-DOS命令终端并键入q 。 将q.exe文件复制到“C:\Wi

  • The Advanced Bash ScriptingGuideiscopyright © 2000, by Mendel Cooper. The author also assertscopyright on all previous versions of this document. This blanket copyright recognizes and protects the rig