问题很简单。之间有什么区别:
template <typename T>
T add(T a, T b)
{
return a + b;
}
template <>
int add<int>(int a, int b)
{
return a + b; //no reason to specialize, but still...
}
Run Code Online (Sandbox Code Playgroud)
和:
template <typename T>
T add(T a, T b)
{
return a + b;
}
int add(int a, int b)
{
return a + b; //no reason to overload, but still...
}
Run Code Online (Sandbox Code Playgroud)
他们似乎是一样的。
考虑以下程序:
#include <stdio.h>
union myUnion
{
int x;
long double y;
};
int main()
{
union myUnion a;
a.x = 5;
a.y = 3.2;
printf("%d\n%.2Lf", a.x, a.y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
-858993459
3.20
Run Code Online (Sandbox Code Playgroud)
很好,因为该int
成员使用该成员的某些位进行解释long double
。但是,相反实际上并不适用:
#include <stdio.h>
union myUnion
{
int x;
long double y;
};
int main()
{
union myUnion a;
a.y = 3.2;
a.x = 5;
printf("%d\n%.2Lf", a.x, a.y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
5
3.20
Run Code Online (Sandbox Code Playgroud)
问题是,为什么long double
不将它们重新解释为某个垃圾值(因为其字节中的4个应表示整数)?这不是巧合,程序针对的所有值输出3.20 a.x
,而不仅仅是5。
我正在尝试编写一个程序,该程序接受一个数字n
作为输入,并将2的结果输出为的幂n
。问题是,n
可能会很大(最多100,000个)。本质上,我正在尝试计算pow(2, n);
非常大的数字。
我认为这样做的方法是将数字存储在数组中,因为没有内置的数值类型可以容纳如此大的值。
这些数字采用十进制格式(以10为基数)。
我使用的是C,而不是C ++,因此无法使用STL向量和其他C ++容器。我也不能使用外部库,例如GMP。我需要在纯C语言中手动实现该算法。
如果我理解正确,则ilogb()
也会处理0
和NaN
参数(并返回FP_ILOGB0
和FP_ILOGBNAN
),而logb()
会引发域错误。据我所知,没有理由使用logb()
。这两个函数之间是否还有其他区别,是否有任何理由logb()
代替ilogb()
?
这是我的课:
class MyArray<T>
{
private T[] data;
public MyArray(int size)
{
data = new T[size];
}
public MyArray(in T[] array)
{
data = new T[array.Length];
for (int i = 0; i < array.Length; i++)
data[i] = array[i];
}
public T this[int i] //I am talking about this indexer
{
get => data[i];
set => data[i] = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我应该像这样定义我的索引器,而不是像上面那样做吗?
public ref T this[int i]
{
get => data[i];
}
Run Code Online (Sandbox Code Playgroud)
我应该选择哪种方法?据我所知,方法 1 允许您在设置值时执行额外的代码,但是方法 2 允许您执行类似的操作int.TryParse(str, out myArrayObj[i]);
编辑:这个问题不仅适用于索引器,而且适用于一般的任何属性。
这两个声明有什么区别:
double math_operation(double x, double (*func)(double));
double math_operation(double x, double func(double));
Run Code Online (Sandbox Code Playgroud)
它们似乎都在 GCC 中使用相同的调用:
math_operation(2.0, sqrt);
Run Code Online (Sandbox Code Playgroud)
它只是语法糖还是更多?
c function-pointers implicit-conversion function-declaration
早在 1982 年,当 Intel 发布 80286 时,他们为分段方案(环 0-3)添加了 4 个特权级别,由全局描述符表 (GDT) 和本地描述符表 (LDT) 中的 2 位指定。
在 80386 处理器中,Intel 添加了分页,但令人惊讶的是,它只有 2 个权限级别(主管和用户),由页目录条目 (PDE) 和页表条目 (PTE) 中的单个位指定。
这意味着仅使用分页的操作系统(如大多数现代操作系统)无法从环 1 和环 2 的存在中受益,这对于驱动程序来说可能非常有用。(例如,Win9x 经常崩溃,因为它正在将有问题的未经检查的驱动程序加载到环 0 中)。
从可移植性的角度来看,环 1 和环 2 的存在是 x86 架构的一个怪癖,可移植操作系统不应该使用它们,因为其他架构只有 2 个特权级别。
但我确信,英特尔工程师在 1985 年设计 386 时并没有考虑到其他平台的可移植性。
那么为什么英特尔不允许分页有 4 个权限级别,比如分段?
我有这个“你好世界!” 用汇编编写的程序(NASM 语法):
; hello.asm
global _start
extern GetStdHandle
extern WriteFile
section .text
_start:
push dword -11
call GetStdHandle
sub esp, 4
mov ebx, esp
push dword 0
push ebx
push message_length
push message
push eax
call WriteFile
add esp, 4
xor eax, eax
ret
section .data
message: db `Hello world!\r\n`
message_length equ $ - message
Run Code Online (Sandbox Code Playgroud)
我尝试将目标文件与 MinGW 链接,ld
但我无法让它工作:
nasm -f win32 hello.asm -o hello.obj
ld -mi386pe hello.obj -o hello.exe -lkernel32
Run Code Online (Sandbox Code Playgroud)
的输出ld
是:
ld: cannot find -lkernel32 …
Run Code Online (Sandbox Code Playgroud) 我知道很少有编译器真正支持 C11 线程(这很可悲,但无论如何)。C11 标准要求不支持线程的实现定义__STDC_NO_THREADS__
. 然而这个程序似乎给出了一个错误:
#include <stdio.h>
#ifndef __STDC_NO_THREADS__
#include <threads.h> //error is here
#endif // __STDC_NO_THREADS__
int main(void)
{
#ifdef __STDC_NO_THREADS__
printf("There are no threads");
#else
printf("There are threads");
#endif // __STDC_NO_THREADS__
}
//Error at line 3: fatal error: threads.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
编译器版本是 GCC 9.2.0 (Windows 10 x64),带有__STDC_VERSION__
= 201710L
(所以它是 C17)。如果你不知道,问题是我的编译器没有定义__STDC_NO_THREADS__
or <threads.h>
,这不符合 C11。可能是什么问题?
我有一个 WinAPI/Win32 应用程序。如果我在从命令提示符运行时尝试使用 cin/cout/cerr,它不起作用。我尝试将项目类型从 Windows 应用程序切换到控制台应用程序,但问题是当我通过双击可执行文件正常运行它时会出现一个控制台窗口。
所以我的问题是:有什么方法可以在 Win32 应用程序中将 cin/cout/cerr 与父(调用)控制台窗口一起使用?(如果参数/c
或被/?
传递,我只想要这种行为,所以如果它不带参数被调用,那么无论它应该启动GUI)。