Tag: 语义

C / C ++ – 函数调用中参数的计算

可能重复: function参数评估顺序 在C / C ++中使用以下结构是否安全? f(g(), h()); 其中g() 首先被评估,然后是h() 。 所有编译器都在所有体系结构上显示相同的行为吗?

声明具有0个元素的数组仍然可以存储值

我知道使用负面索引只是纯粹的运气。 但出于好奇,我尝试了这个。 我知道你可以声明array [0]; 就像malloc(0); 是合法的。 但是为什么我可以在array [0]中存储一个值? #include #include int main(void) { int i; int array[0]; array[0] = 5; printf(“%d\n”,array[0]); getch(); }

typedef vs struct / union / enum背后的基本原理是什么,不能只有一个命名空间?

在C中,如果我声明struct / union / enum: struct Foo { int i … } 当我想使用我的结构时,我需要指定标签: struct Foo foo; 要放弃这个要求,我必须使用typedef为我的结构添加别名: typedef struct Foo Foo; 为什么默认情况下不能在同一个“命名空间”中包含所有类型/结构/任何内容? 在每个变量声明中要求声明标记的决定背后的理由是什么(除非typdefe’d)? 许多其他语言没有做出这种区分,似乎它只带来了额外的复杂程度恕我直言。

Ruby的max函数命令如何重复?

我一直在看Ruby的Enumerable mixin(v2.4.1)中的max方法 。 这是一种相当简单的方法,但是当重复项存在时它如何命令项目有点令人困惑。 例如: x = [1,2,3,4,5,6,7,8,9] x.max {|a, b| a%2 b%2} => 1 10.times{|y| p x.max(y) {|a, b| a%2 b%2}} [] [1] [1, 7] # why is 7 the next element after 1? [3, 1, 5] # why no more 7? [7, 3, 1, 5] # 7 is now first [9, 7, 3, […]

为什么(x + = x + = 1)在C和Javascript中的评价方式不同?

如果变量x值最初为0,则表达式x += x += 1将在C中计算为2,在Javascript中计算为1。 C的语义对我来说很明显: x += x += 1被解释为x += (x += 1) ,这反过来相当于 x += 1 x += x // where x is 1 at this point Javascript解释背后的逻辑是什么? 什么规范强制执行这种行为? (顺便说一下,应该注意Java在这里与Javascript一致)。 更新:事实certificate表达式x += x += 1具有根据C标准的未定义行为(感谢ouah , John Bode , DarkDust , Drew Dormann ),这似乎破坏了一些读者的问题的全部要点。 通过在其中插入标识函数,可以使表达式符合标准: x += id(x += 1) 。 可以对Javascript代码进行相同的修改,问题仍然如所述。 […]

char a [的语义

我最近在向同事解释原因时感到很尴尬 char a[100]; scanf(“%s”, &a); // notice a & in front of ‘a’ 是非常糟糕的,稍微好一点的方法是: char a[100]; scanf(“%s”, a); // notice no & in front of ‘a’ 好。 对于每个人都准备告诉我为什么不应该出于安全原因使用scanf:放松。 这个问题实际上是关于“&a”与“a”的含义。 问题是,在我解释了为什么它不起作用之后,我们尝试了它(使用gcc)并且它起作用=))。 我赶紧跑了 printf(“%p %p”, a, &a); 它会打印两次相同的地址。 任何人都可以向我解释发生了什么事吗?

是否存在else if语句?

前一段时间没有站在这样的线路之后: if (arg) invk(test); else if (test) { alot(); stuff(); } 我决定在1920×1200次中为自己提供更好的可读性,而不是省略{} 。 所以我写了一个工具来重新格式化我现有的代码。 后来我注意到该工具中的一个错误 if (x) { … } else if(y) { … } else if(z) { … } 已经被改变了(没有通过不经意地改变行为)成: if (x) { … } else { if(y) { … } else { if(z) { … } } } 这让我意识到(无意识)这实际上是C语言和语义规则的其他内容。 那么甚至还有一个像else if()现有的声明,或者它只是滥用语义导致这个有用但是(为了这个目的让我们称它)混淆起源的措辞打破了任何格式化规则并且只是作为人类可读的?