在JavaScript中,有两个基本上说'我不存在'的值 - undefined
和null
.
程序员未分配任何内容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
吗?
在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) 有人提供一个示例是否会因为错位而将指针从一种类型转换为另一种类型失败?
在对这个答案的评论中,两者都表示做了类似的事情
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) 有人声称
编译器可以自由地将指针变量重用于其他目的之后
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).
结果被允许是关键的未定义行为.
这证实了这一说法,但我希望从标准本身而不是附件中看到适当的引用.
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) 在最近的讨论(见评论这个答案),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
库函数的所有返回值中删除之外,还有其他方法会丢失有关对象可变性的任何信息吗?
根据ISO/IEC 9899:19996.7.5§2,
每个声明符声明一个标识符,并声明当与表达式中出现的声明符形式相同的操作数出现在表达式中时,它指定一个函数或对象,其范围,存储持续时间和声明说明符指示的类型.
我不知道为什么表达式突然出现在声明符语义中.你能给我一些可以帮助我理解其含义的例子吗?
这与此问题有些相关,但我并不是要求有关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
循环迭代数组或类数组对象的元素我从朋友那里听说C中的二维数组只能在语法上得到支持.
他告诉我要更好地使用,float arr[M * N]
而不是float[M][N]
因为像gcc这样的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) 我知道它很基本,但我无法让它工作.它不断抛出"对象预期"错误......
$(document).ready(function(){
setTimeout('showMessage()', 1000);
function showMessage() {
alert('abc');
}
});
Run Code Online (Sandbox Code Playgroud) c ×8
pointers ×4
javascript ×3
alignment ×1
arrays ×1
assembly ×1
c11 ×1
c99 ×1
casting ×1
const ×1
free ×1
gcc ×1
jquery ×1
linked-list ×1
linux-kernel ×1
null ×1
settimeout ×1
struct ×1
undefined ×1