c
#include<stdio.h>
int main()
{
float *q=NULL;
printf("%f\n",q);
printf("%p",q);
}
输出
0.000000
0000000000000000
printf(“%p”,q);
包含此语句是因为%p是NULL的格式说明符,没有其他原因
C++
#include<iostream>
int main()
{
float *q=nullptr;
std::cout<<q;
}
输出
0
所以,如果我的两个假设都是正确的,那么为什么在C++中nullptr将它的类型从nullptr_t改为float类型,而在C中NULL没有将它的类型从(void)改为(float)?
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如果格式字符串为常量,则某些编译器会帮助诊断错误,但不要求它们这样做。
指针没有更改类型。在cout版本中,您让系统自然打印指针值。在printf版本中,您强制使用%f。将格式字符串更改为%ld,您将得到不同的结果。
printf对您作为参数传递的内容一无所知。它相信程序员知道他在做什么。
Q-Learning 决策 假设我们的行为准则已经学习好了, 现在我们处于状态s1, 我在写作业, 我有两个行为 a1, a2, 分别是看电视和写作业, 根据我的经验, 在这种 s1 状态下, a2 写作业 带来的潜在奖励要比 a1 看电视高, 这里的潜在奖励我们可以用一个有关于 s 和 a 的 Q 表格代替, 在我的记忆Q表格中, Q(s1, a1)=-2 要小于 Q(s1, a2)=1, 所以
描述 (Description) 可以使用此函数代替单引号。 这不是一个真正的函数,更像是一个运算符,但如果你在另一个程序员的程序中看到它而不记住它是什么,你可能会看到这里。 您实际上可以使用任何一组分隔符,而不仅仅是括号。 语法 (Syntax) 以下是此函数的简单语法 - q ( string ) 返回值 (Return Value) 此函数返回单引号字符串。 例子 (Example) 以下
本文向大家介绍PrologCLP(Q),包括了PrologCLP(Q)的使用技巧和注意事项,需要的朋友参考一下 示例 CLP(Q)对有理数进行推理。 例:
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