小编Dan*_*sen的帖子

`c(1L, 2L, 3L)` 和 `1:3` 之间的修改时复制行为不同

我正在阅读Hadley Wickham 的Advanced R,试图解决第 2.3.6 节中关于修改时复制的练习 2

解释为什么tracemem()在运行此代码时会显示两个副本。提示:仔细查看此代码与本节前面显示的代码之间的区别。

x <- c(1L, 2L, 3L)
tracemem(x)

x[[3]] <- 4
Run Code Online (Sandbox Code Playgroud)

(前面的代码将双精度列表中的一个元素更改为另一个双精度,仅产生一个副本。)

在Grosser 和 Bumann的Advanced R Solutions 中他们解释说第二个副本是由于类型强制,从整数到双精度。它们没有定义xc(1L, 2L, 3L),而是使用x <- 1:3,我认为这是等效的(使用identical也返回比较它们TRUE)。但是,运行上面的代码(在我这边)只会产生一个副本,但是运行以下代码会产生两个副本:

x <- 1:3
tracemem(x)

x[[3]] <- 4
Run Code Online (Sandbox Code Playgroud)

运行此代码还会产生两个副本:

x <- c(1L, 2L, 3L)
typeof(x)
tracemem(x)

x[[3]] <- 4
Run Code Online (Sandbox Code Playgroud)

例如,替换typeofwithclass只会产生一个副本,但替换为modeor 会pryr::otype产生两个副本。但简单地打印x出来反而会产生一份副本。

那么c(1L, …

r

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

打印输入的字符时,getchar/putchar会返回带问号的框

在Windows 10(丹麦语)的Codeblocks中使用K&R中的代码示例.以下示例按预期工作:

#include <stdio.h>

int main() {
    char c = 'a';
    putchar(c);
}
Run Code Online (Sandbox Code Playgroud)

但是,下面打印一系列带有问号的方框,与我输入的字符数相同:

#include <stdio.h>

int main() {
    char c;

    while (c = getchar() != '\n') {
        putchar(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以它看起来像编码问题.运行时,会在标题中打开一个命令提示符,其中包含"C:\ Users\username\Desktop\filename.exe",我的用户名包含丹麦字符"å",后面用"Õ"替换.命令提示符使用CP 850字符集.

(顺便说一句,我没有检查字符是否等于EOF,因为这会产生奇怪的结果.按Enter键打印预期的盒子数,再加上一个\n,但它不会结束程序.)

c codeblocks character-encoding

2
推荐指数
1
解决办法
187
查看次数

标签 统计

c ×1

character-encoding ×1

codeblocks ×1

r ×1