在C语言中,如果初始化一个这样的数组:
int a[5] = {1,2};
Run Code Online (Sandbox Code Playgroud)
那么未明确初始化的数组的所有元素将用零隐式初始化.
但是,如果我初始化这样的数组:
int a[5]={a[2]=1};
printf("%d %d %d %d %d\n", a[0], a[1],a[2], a[3], a[4]);
Run Code Online (Sandbox Code Playgroud)
输出:
1 0 1 0 0
Run Code Online (Sandbox Code Playgroud)
我不明白,为什么a[0]
打印1
而不是0
?是不确定的行为?
注意:这个问题是在接受采访时提出的.
有人可以给出一个明确的定义以及一个简单的例子来解释什么是不知道JavaScript和node.js的人的"回调地狱"?
何时(在什么样的设置中)出现"回调地狱问题"?
它为什么会发生?
"回调地狱"总是与异步计算有关吗?
或者也可以在单线程应用程序中发生"回调地狱"?
我参加了Coursera的Reactive课程,Erik Meijer在他的一个讲座中说RX解决了"回调地狱"的问题.我问在Coursera论坛上什么是"回调地狱",但我没有得到明确答案.
在一个简单的例子中解释"回调地狱"之后,你能否展示RX如何在这个简单的例子中解决"回调地狱问题"?
javascript callback reactive-programming language-lawyer rxjs
我是C++的新手.我经常看到如下条件语句:
if
statement_0;
else if
statement_1;
Run Code Online (Sandbox Code Playgroud)
题:
从语法上讲,我应该将其else if
视为单个关键字吗?或者它实际上是如下所示if
的外部嵌套语句else
?
if
statement_0;
else
if
statement_1;
Run Code Online (Sandbox Code Playgroud) 考虑以下计划:
#include <iostream>
int main = ( std::cout << "C++ is excellent!\n", 195 );
Run Code Online (Sandbox Code Playgroud)
在Windows 7操作系统上使用g ++ 4.8.1(mingw64),程序编译并运行正常,打印:
C++非常棒!
到控制台.main
似乎是一个全局变量而不是一个函数; 如果没有该功能,该程序如何执行main()
?这段代码是否符合C++标准?程序的行为是否定义明确?我也使用了该-pedantic-errors
选项,但该程序仍然编译并运行.
在Bjarne Stroustrup的"C++编程语言"第4版36.3.6
STL类操作部分中,以下代码用作链接示例:
void f2()
{
std::string s = "but I have heard it works even if you don't believe in it" ;
s.replace(0, 4, "" ).replace( s.find( "even" ), 4, "only" )
.replace( s.find( " don't" ), 6, "" );
assert( s == "I have heard it works only if you believe in it" ) ;
}
Run Code Online (Sandbox Code Playgroud)
断言失败gcc
(看到它直播)和Visual Studio
(看到它的实时),但它在使用Clang时没有失败(请参见实时).
为什么我会得到不同的结果?这些编译器是否错误地评估了链接表达式,或者此代码是否表现出某种形式的未指定 …
c++ operator-precedence language-lawyer unspecified-behavior c++11
编辑:这个问题并不是一个讨论未定义行为的(de)优点的论坛,但这就是它的变化.在任何情况下,这个关于假设的C编译器没有未定义行为的线程可能对那些认为这是一个重要主题的人更感兴趣.
当然,"未定义行为"的经典伪装例子是"鼻子恶魔" - 物理上是不可能的,无论C和C++标准允许什么.
因为C和C++社区倾向于强调未定义行为的不可预测性以及允许编译器在遇到未定义行为时使程序完全做任何事情的想法,所以我假设标准没有任何限制关于行为,以及未定义的行为.
[C++14: defns.undefined]:
[..]允许的未定义行为包括完全忽略不可预测的结果,在转换或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式执行,终止转换或执行(发布诊断信息).[..]
这实际上指定了一小组可能的选项:
我假设在大多数情况下,编译器选择忽略未定义的行为; 例如,当读取未初始化的内存时,可能是插入任何代码以确保一致行为的反优化.我认为陌生人类型的未定义行为(例如" 时间旅行 ")将属于第二类 - 但这需要记录这些行为并"环境特征"(所以我猜鼻腔恶魔只能由地狱计算机?).
我误解了这个定义吗?这些仅仅是可能构成未定义行为的例子,而不是一个全面的选项列表吗?"任何可能发生的事情"的说法仅仅意味着忽视这种情况的意外副作用吗?
编辑:两个小问题澄清:
if (1) int a = 2;
Run Code Online (Sandbox Code Playgroud)
这行代码是有效的 C++ 代码(至少可以编译)但无效的 C 代码(无法编译)。我知道语言之间存在差异,但这一差异是出乎意料的。
我一直以为语法是
if (expr) statement
Run Code Online (Sandbox Code Playgroud)
但这将使其在两者中都有效。
我的问题是:
使用%p
转换说明符打印空指针是不确定的行为?
#include <stdio.h>
int main(void) {
void *p = NULL;
printf("%p", p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个问题适用于C标准,而不适用于C实现.
这段代码是否有效(和定义的行为)?
int &nullReference = *(int*)0;
Run Code Online (Sandbox Code Playgroud)
这两个g ++以及铛++编译它没有任何警告,即使使用-Wall
,-Wextra
,-std=c++98
,-pedantic
,-Weffc++
...
当然,引用实际上不是null,因为它无法访问(这意味着取消引用空指针),但我们可以通过检查其地址来检查它是否为null:
if( & nullReference == 0 ) // null reference
Run Code Online (Sandbox Code Playgroud) C++中的括号用于许多地方:例如,在函数调用和分组表达式中,以覆盖运算符优先级.除了非法的额外括号(例如函数调用参数列表周围)之外,C++的一般但非绝对规则是额外的括号永远不会受到伤害:
5.1主要表达式[expr.prim]
5.1.1一般[expr.prim.general]
6带括号的表达式是一个主表达式,其类型和值与所附表达式的类型和值相同.括号的存在不会影响表达式是否为左值.除非另有说明,否则带括号的表达式可以在与可以使用所包含的表达式的上下文完全相同的上下文中使用,并且具有相同的含义.
问题:在哪些上下文中,额外的括号会改变C++程序的含义,而不是覆盖基本的运算符优先级?
注意:我认为没有括号的指针到成员语法的限制&qualified-id
超出了范围,因为它限制了语法而不是允许两个具有不同含义的语法.同样,在预处理程序宏定义中使用括号也可以防止不必要的运算符优先级.
language-lawyer ×10
c++ ×7
c ×4
c++11 ×2
arrays ×1
c++-faq ×1
c11 ×1
c99 ×1
callback ×1
javascript ×1
null ×1
parentheses ×1
reference ×1
rxjs ×1
syntax ×1