小编Sco*_*ter的帖子

为什么在C++中允许删除空指针

我记得在某个地方读过delete NULL要在C++中成为有效的操作是必要的,但是我不能记得为什么它应该如此.有人请提醒我吗?

c++ delete-operator

8
推荐指数
2
解决办法
1054
查看次数

为什么Perl open()文档使用两种不同的FILEHANDLE样式?

open函数文档显示open()as 的语法:

  • 打开FILEHANDLE,EXPR
  • 打开FILEHANDLE,MODE,EXPR
  • 打开FILEHANDLE,MODE,EXPR,LIST
  • 打开FILEHANDLE,MODE,REFERENCE
  • 打开FILEHANDLE

在示例中,它们具有正常的$ -prefixed变量用于文件句柄的位置:

open(my $fh, "<", "input.txt")
Run Code Online (Sandbox Code Playgroud)

以及使用裸字的示例:

open(FOO, "|tr '[a-z]' '[A-Z]'");
Run Code Online (Sandbox Code Playgroud)

一个问题是每个样式的名称是什么,在每种情况下"我正在使用_ _作为文件句柄"?另一种是,为什么他们开始使用裸字open()文档中?它似乎是后来的用途都不涉及正常的文件名open().在这些情况下,$ -prefixed表单是不可接受的吗?

perl filehandle bareword

8
推荐指数
1
解决办法
663
查看次数

为什么Java Number类实现了byteValue()和shortValue()?

Java的Number类是针对包装基本类型(字节,短,整型,长整型,浮点,双精度)以及其他类,如BigInteger和BigDecimal和具有6存取(又名吸气)方法类的基类:

byte    byteValue()
abstract double doubleValue()
abstract float  floatValue()
abstract int    intValue()
abstract long   longValue()
short   shortValue()
Run Code Online (Sandbox Code Playgroud)

我不明白为什么他们没有使byteValue()和shortValue()也抽象.

java

8
推荐指数
2
解决办法
784
查看次数

为什么ctype函数需要int但需要unsigned char/EOF?

我正在使用gcc(Ubuntu/Linaro 4.6.1-9ubuntu3)4.6.1

手册页isalnum()说:

SYNOPSIS
       #include <ctype.h>

       int isalnum(int c);
Run Code Online (Sandbox Code Playgroud)

但是,它还说:

这些函数检查c是否必须具有unsigned char或EOF 的值,...

我发现isalnum()会爆发非常大的正(或负)int值(但它会处理所有short int值).

说明传入的int的手册页是否必须具有值a,unsigned char因为C库编写者保留了以isalnum()不会在没有爆炸的int情况下处理所有值的方式实现的权利?

c

7
推荐指数
1
解决办法
328
查看次数

为什么在编译时没有捕获数组文字大小不匹配?

我有以下代码:

import std.stdio;

int main(string[] args)
{
   int[3] my_array = [1, 2];
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个编译很好,然后在执行时中止,给出这个错误:

arrays_init
object.Exception@src/rt/arraycat.d(31): lengths don't match for array copy
----------------
arrays_init(_Dmain+0x64) [0x416bbc]
arrays_init(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x1c) [0x418c5c]
arrays_init(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x4185d6]
arrays_init(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x3b) [0x418ca3]
arrays_init(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x4185d6]
arrays_init(main+0xd1) [0x418561]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed) [0x7f60bc41d30d]
Run Code Online (Sandbox Code Playgroud)

如果数组文字有3个项,则运行正常,因此显然数组文字必须与静态数组的大小相匹配.但是这不应该给出编译错误,因为两者的大小都可以在编译时计算出来吗?

d

7
推荐指数
2
解决办法
300
查看次数

如何通过右值参考返回工作?

就在我认为我理解rvalue引用的时候,我遇到了这个问题.代码可能不必要地长,但这个想法很简单.有一个main()函数和returnRValueRef()函数.

#include <iostream>

#define NV(x) "[" << #x << "=" << (x) << "]"
#define log(x) cout << __FILE__ << ":" << __LINE__ << " " << x << endl

using namespace std;

class AClass {
 public:
  int a_;

  AClass() : a_(0) {
    log("inside default constructor");
  }
  AClass(int aa) : a_(aa) {
    log("inside constructor");
  }
  int getInt() const {
    return a_;
  }
  void setInt(int a) {
    a_ = a;
  }

  AClass(AClass const & other) : a_(other.a_) {
    log("inside copy constructor"); …
Run Code Online (Sandbox Code Playgroud)

rvalue-reference c++11

7
推荐指数
1
解决办法
903
查看次数

为什么C main函数可以使用或不使用参数进行编码?

只是想知道为什么这样

int main(void){}
Run Code Online (Sandbox Code Playgroud)

编译和链接

这样做:

int main(int argc, char **argv){}
Run Code Online (Sandbox Code Playgroud)

为什么不需要一个或另一个?

gcc甚至会编译并链接一个参数:

int main(int argc){}
Run Code Online (Sandbox Code Playgroud)

但是用-Wall发出这个警告:

smallest_1.5.c:3:1: warning: ‘main’ takes only zero or two arguments [-Wmain]
Run Code Online (Sandbox Code Playgroud)

我不是在问"他们怎么允许这个?" 但正如"调用者和链接器如何处理主要的多种可能性?"

c

7
推荐指数
2
解决办法
821
查看次数

Book中的代码不起作用

我正在学习D并且正在采取婴儿步骤,所以请耐心等待我.

我正在读这本名为"D编程语言"的书.我正在使用D-IDE代码.我目前正在编写一个程序,如果该书还没有这个单词,它应该在它的词汇表(词典)中添加单词.

但问题是,本书提供的代码无效,而不仅仅是继续阅读结果应该是什么等等.我想尝试解决它.当然是我对D这么新的问题.

代码看起来像这样:

import std.stdio, std.string;

void main() {
    uint[string] dictionary;
    foreach(line; stdin.byLine()) {
    // Break sentence into words
    // Add each word in the sentence to the vocabulary
        foreach(word; splitter(strip(line))) {
            if(word in dictionary) continue; // Nothing to do
            auto newID = dictionary.length;
            dictionary[word] = newID;
            writeln(newID, '\t', word);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

IDE说Error: undefined identifier splitter,因为我对Java很有经验,我猜错误意味着该方法不存在,并且因此尝试将其作为变量处理,但这也不存在.所以我尝试将其改为"拆分".这会在字典中产生另一个错误:Error: associative arrays can only be assigned values with immutable keys, not char[]

所以我真的不知道如何解决这个问题并让它发挥作用.当书本中应该教你的代码时,令人沮丧的是不行.我正在使用dmd2.

d

6
推荐指数
1
解决办法
321
查看次数

为什么要使用new和delete?

我是C++的新手,我想知道为什么我甚至不愿意使用新的和删除?它可能导致问题(内存泄漏),我不明白为什么我不应该只是在没有new运算符的情况下初始化变量.有人可以向我解释一下吗?这个具体问题很难谷歌.

c++ memory-management delete-operator

6
推荐指数
2
解决办法
2894
查看次数

无法将一些utf-8字符在C ++中正确打印到txt文件

我的内存中有一些UTF-8字符串(这是更大系统的一部分),基本上是欧洲国家/地区的地名。我正在尝试将它们写入文本文件。我在Linux机器(Fedora)上。因此,当我将这些名称字符串(char指针)写入文件时,文件将以扩展的ASCII格式保存。

现在,我将此文件复制到Windows计算机,在其中我需要将这些名称加载到mySQL DB。当我在notepad ++上打开文本文件时,它再次将编码默认为ANSI。但是我可以选择对UTF-8进行编码,除以下3个字符外,几乎所有字符看起来都与预期的一样:-?,?和?。它们在文本中显示为&#336,&#337和&#369。

是否有人对可能出什么问题有任何想法。我知道这些不是扩展ASCII符号的一部分。但是我将其写入文件的方式类似于:

// create out file stream
std::ofstream fs("sample.txt");

// loop through utf-8 formatted string list
if(fs.is_open()) {
    for(int i = 0; i < num_strs; i++) {
        fs << str_name; // unsigned char pointer representing name in utf-8 format
        fs << "\n";
    }
}
fs.close();
Run Code Online (Sandbox Code Playgroud)

即使使用ú和ö和ß这样的字符,一切也看起来不错。问题仅在于上述三个字符。有什么想法/建议/评论吗?谢谢!

例如,字符串“Gyömr?” 显示为“Gyömr&#369”。

c++ encoding utf-8 character-encoding

5
推荐指数
1
解决办法
1473
查看次数