小编Chr*_*oph的帖子

为什么JavaScript中存在"null"值?

在JavaScript中,有两个基本上说'我不存在'的值 - undefinednull.

程序员未分配任何内容undefined的属性将是,但为了使属性成为必需null,null必须明确分配给它.

我曾经认为需要null因为undefined原始价值和null对象.它不是,即使typeof null会产生'object':实际上,两者都是原始值 - 这意味着既不能undefined也不null能从构造函数返回,因为它们都将被转换为空对象(必须抛出错误来宣告构造函数中的失败).

它们也都false在布尔上下文中进行求值.唯一真正的区别我能想到的是,一个计算结果为NaN,其他0的数字环境.

那么为什么会出现这两种情况undefined,null如果这只会让那些null在试图找出属性是否已经设置时错误检查的程序员感到困惑?

我想知道的是,如果有人有一个合理的例子,那就是必须使用null而不是用来表示undefined.

因此,普遍的共识似乎undefined是"没有这样的财产",而null意味着"财产确实存在,但没有价值".

我可以忍受,如果JavaScript实现实际上会强制执行此行为 - 但它undefined是一个完全有效的原始值,因此可以很容易地将其分配给现有属性以破坏此合同.因此,如果要确定属性是否存在,则必须使用in运算符或hasOwnProperty()任何方式.再一次:对于undefined和的单独值的实际用途是null什么?

我实际上undefined在我想要取消设置不再使用但我不想要的属性值时使用delete.我应该用null吗?

javascript null language-features undefined

111
推荐指数
5
解决办法
3万
查看次数

linux/list.h中container_of宏背后的原理

在linux内核列表的实现中/include/linux/list.h,container_of宏的第一行(下面粘贴)背后的基本原理是什么?

const typeof( ((type *)0)->member ) *__mptr = (ptr);
Run Code Online (Sandbox Code Playgroud)

在我的示例代码中,我删除了这一行并将定义更改为

#define container_of(ptr, type, member) ({                      \
     (type *)( (char *)ptr - offsetof(type,member) );})
Run Code Online (Sandbox Code Playgroud)

我的代码仍显示预期的结果.那么第一行是多余的吗?或者它有一些我不知道的隐藏陷阱?

我在Faq/LinkedLists找到的代码

/**
 * container_of - cast a member of a structure out to the containing structure
 * @ptr:        the pointer to the member.
 * @type:       the type of the container struct this is embedded in.
 * @member:     the name of the member within the struct.
 *
 */
#define container_of(ptr, type, …
Run Code Online (Sandbox Code Playgroud)

c struct pointers linked-list linux-kernel

31
推荐指数
1
解决办法
4724
查看次数

x86上的错误对齐指针

有人提供一个示例是否会因为错位而将指针从一种类型转换为另一种类型失败?

在对这个答案的评论中,两者都表示做了类似的事情

char * foo = ...;
int bar = *(int *)foo;
Run Code Online (Sandbox Code Playgroud)

如果启用了对齐检查,即使在x86上也可能导致错误.

set $ps |= (1<<18)在GDB中设置对齐检查标志后尝试生成错误条件,但没有任何反应.

工作(即非工作;))示例是什么样的?


答案中没有任何代码片段在我的系统上失败 - 我将尝试使用不同的编译器版本,稍后在不同的PC上.

顺便说一句,我自己的测试代码看起来像这样(现在也使用asm来设置AC标志和未对齐的读写):

#include <assert.h>

int main(void)
{
    #ifndef NOASM
    __asm__(
        "pushf\n"
        "orl $(1<<18),(%esp)\n"
        "popf\n"
    );
    #endif

    volatile unsigned char foo[] = { 1, 2, 3, 4, 5, 6 };
    volatile unsigned int bar = 0;

    bar = *(int *)(foo + 1);
    assert(bar == 0x05040302);

    bar = *(int *)(foo + 2);
    assert(bar == 0x06050403);

    *(int …
Run Code Online (Sandbox Code Playgroud)

c pointers casting alignment

19
推荐指数
3
解决办法
1万
查看次数

是否允许编译器回收释放的指针变量?

有人声称

编译器可以自由地将指针变量重用于其他目的之后 realloc 被释放,所以你不能保证它具有与之前相同的价值

void *p = malloc(42);
uintptr_t address = (uintptr_t)p;
free(p);

// [...] stuff unrelated to p or address

assert((uintptr_t)p == address);
Run Code Online (Sandbox Code Playgroud)

可能会失败.

C11附件J.2读

使用指向通过调用free或realloc函数释放的空间的指针的值(7.22.3)[ 未定义 ]

但附件当然不是规范性的.

附件L.3(规范性的,但可选的)告诉我们,如果

使用指向通过调用free或realloc函数解除分配的空间的指针的值(7.22.3).

结果被允许是关键的未定义行为.

这证实了这一说法,但我希望从标准本身而不是附件中看到适当的引用.

c free pointers standards-compliance compiler-optimization

14
推荐指数
1
解决办法
877
查看次数

如何在GCC x86内联汇编中使用地址常量

GCC工具链默认使用AT&T汇编语法,但可通过该.intel_syntax指令获得对Intel语法的支持.

此外,AT和T以及英特尔语法都有a prefix和a noprefix版本,不同之处在于它们是否需要使用%sigil 为寄存器名称添加前缀.

根据存在的指令,地址常量的格式会发生变化.

我们考虑以下C代码

*(int *)0xdeadbeef = 0x1234;
Run Code Online (Sandbox Code Playgroud)

使用objdump -d,我们发现它被编译为以下汇编程序指令

movl $0x1234,0xdeadbeef
Run Code Online (Sandbox Code Playgroud)

由于没有涉及到寄存器,这对于正确的语法.att_syntax prefix.att_syntax noprefix,即.嵌入在C代码中,它们看起来像这样

__asm__(".att_syntax prefix");
__asm__("movl $0x1234,0xdeadbeef");

__asm__(".att_syntax noprefix");
__asm__("movl $0x1234,0xdeadbeef");
Run Code Online (Sandbox Code Playgroud)

您可以选择用括号括起地址常量,即.

__asm__("movl $0x1234,(0xdeadbeef)");
Run Code Online (Sandbox Code Playgroud)

也会奏效.

将sigil添加到普通地址常量时,代码将无法复制

__asm__("movl $0x1234,$0xdeadbeef"); // won't compile
Run Code Online (Sandbox Code Playgroud)

当用paranthesis围绕这个表达式时,编译器将发出错误的代码而不发出警告,即

__asm__("movl $0x1234,($0xdeadbeef)"); // doesn't warn, but doesn't work!
Run Code Online (Sandbox Code Playgroud)

这将错误地发出指令

movl $0x1234,0x0
Run Code Online (Sandbox Code Playgroud)

在Intel模式下,PTR如果可能存在歧义,则地址常量必须以段寄存器为前缀,以及操作数大小和标志.在我的机器上(采用Windows XP和当前MinGW和Cygwin GCC版本的英特尔双核笔记本电脑),ds默认使用该寄存器.

常量周围的方括号是可选的.如果省略了段寄存器,但是括号存在,也可以正确识别地址常量.但是,忽略寄存器会在我的系统上发出警告.

prefix模式中,段寄存器必须以前缀为前缀%,但仅使用括号仍然有效.这些是生成正确指令的不同方法:

__asm__(".intel_syntax noprefix");
__asm__("mov DWORD PTR ds:0xdeadbeef,0x1234");
__asm__("mov …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc inline-assembly

9
推荐指数
1
解决办法
7767
查看次数

常量正确性和不变的分配对象

在最近的讨论(见评论这个答案),R ..建议不要为了指针-TO-别名const类型,你将不能够很容易地解除分配在标准的C程序中引用的对象(记住:free()需要一个非- const指针参数和C99 6.3.2.3仅允许从不合格到合格的转换)。

C语言显然假定存在任何已分配对象的所有者,即某人必须存储const指向该对象的非指针,而该人负责释放。

现在,考虑一个用于分配和初始化对象的库,这些对象不能通过用户空间代码进行修改,因此函数调用始终返回const合格的指针。

显然,库是对象的所有者,应该保留一个非const指针,这有点愚蠢,因为用户已经提供了一个完全有效的,但是const在每次库调用时都复制了指针的副本。

为了取消分配这样的对象,库必须丢弃const限定符;否则,必须取消限定符。据我所知,以下

void dealloc_foo(const struct foo *foo)
{
    free((void *)foo);
}
Run Code Online (Sandbox Code Playgroud)

有效的C; 仅当foo参数另外被restrict限定时才无效。

但是,抛弃const似乎有点乱。

除了从const库函数的所有返回值中删除之外,还有其他方法会丢失有关对象可变性的任何信息吗?

c pointers const

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

C99中的声明符语义

根据ISO/IEC 9899:19996.7.5§2,

每个声明符声明一个标识符,并声明当与表达式中出现的声明符形式相同的操作数出现在表达式中时,它指定一个函数或对象,其范围,存储持续时间和声明说明符指示的类型.

我不知道为什么表达式突然出现在声明符语义中.你能给我一些可以帮助我理解其含义的例子吗?

c c99 c11

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

JavaScript最佳实践

这与此问题有些相关,但我并不是要求有关JavaScript最佳实践的资源,而是您的实际建议.

我将从我自己的列表开始.如果您确定该建议没有争议,您可以发布答案或直接编辑问题.

开始了:

  • 总是用 var
  • 大写构造函数的名称 - 没有别的
  • 使用===比较
  • 使用原语,如显式转换Number(),String(),Boolean()
  • 检查原始类型 typeof
  • 检查对象类型 instanceof
  • 检查内置对象类型Object.prototype.toString()以避免跨框架问题,例如

    Object.prototype.toString.call(obj) === '[object Array]'
    
    Run Code Online (Sandbox Code Playgroud)
  • 检查this构造函数,例如

    function MyObject() {
        if(!(this instanceof arguments.callee))
            throw new Error('constructor called with invalid `this`');
        // [...]
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用匿名函数进行命名空间不会污染全局范围,例如

    (function() {
        var noGlobalVar = 'foo';
        // [...]
    })();
    
    Run Code Online (Sandbox Code Playgroud)
  • hasOwnProperty()for..in循环 - 不要假设没有人搞乱原型

  • 不要使用for..in循环迭代数组或类数组对象的元素

javascript

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

C中的二维数组是否需要使所有元素连续?

我从朋友那里听说C中的二维数组只能在语法上得到支持.

他告诉我要更好地使用,float arr[M * N]而不是float[M][N]因为像gcc这样的C编译器不能保证在每个系统/平台上数据都在内存中串联.

我想在我的硕士论文中用它作为论据,但我没有任何参考.

所以第一个问题:

他说的是对的吗?

第二个问题:

你知道是否有书或文章在哪里可以找到这个陈述?

谢谢+问候

c arrays

5
推荐指数
2
解决办法
267
查看次数

C模糊问题

虽然编写非常简单的程序来删除空格,制表符,换行符,但我遇到了一些我实际上并没有先抓到的东西; 即使if条件为真,只有当tab,space或newline不存在时,仍然会因为某些原因执行上面提到的..这里是代码

#include <cstdio>
#include <cstring>
#include <stdio.h>
#include <string.h>

#define LGT 100

void rem(char s[])
{
 int i;
 for(i=(strlen(s)-1);i>=0;i--)
  if(s[i]!=' ' || s[i]!='\t' || s[i]!='\n')
   break;
  s[i+1]='\0';

}
int main(void)
{
 char v[LGT]={"sdsfg\t"};

 rem(v);
 printf("%s\n",v);
 getchar();
}
Run Code Online (Sandbox Code Playgroud)

c

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

setTimeout无法正常工作,我在这里遗漏了什么吗?

我知道它很基本,但我无法让它工作.它不断抛出"对象预期"错误......

 $(document).ready(function(){   
    setTimeout('showMessage()', 1000); 

    function showMessage() { 
        alert('abc');
    } 
    });
Run Code Online (Sandbox Code Playgroud)

javascript jquery settimeout

0
推荐指数
2
解决办法
1270
查看次数