标签: language-lawyer

关于C中数组初始化的困惑

在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?是不确定的行为?

注意:这个问题是在接受采访时提出的.

c arrays initialization language-lawyer

101
推荐指数
3
解决办法
4928
查看次数

什么是"回调地狱"以及RX解决它的方式和原因?

有人可以给出一个明确的定义以及一个简单的例子来解释什么是不知道JavaScript和node.js的人的"回调地狱"?

何时(在什么样的设置中)出现"回调地狱问题"?

它为什么会发生?

"回调地狱"总是与异步计算有关吗?

或者也可以在单线程应用程序中发生"回调地狱"?

我参加了Coursera的Reactive课程,Erik Meijer在他的一个讲座中说RX解决了"回调地狱"的问题.我问在Coursera论坛上什么是"回调地狱",但我没有得到明确答案.

在一个简单的例子中解释"回调地狱"之后,你能否展示RX如何在这个简单的例子中解决"回调地狱问题"?

javascript callback reactive-programming language-lawyer rxjs

100
推荐指数
4
解决办法
6万
查看次数

"else if"是一个关键字吗?

我是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)

c++ syntax language-lawyer

99
推荐指数
5
解决办法
9623
查看次数

具有名为main的全局变量而不是main函数的程序如何工作?

考虑以下计划:

#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选项,但该程序仍然编译并运行.

c++ program-entry-point language-lawyer

97
推荐指数
5
解决办法
9849
查看次数

"C++编程语言"第4版第36.3.6节中的代码是否有明确定义的行为?

在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

95
推荐指数
1
解决办法
9797
查看次数

"未定义的行为"真的允许*发生任何事情吗?

编辑:这个问题并不是一个讨论未定义行为的(de)优点的论坛,但这就是它的变化.在任何情况下,这个关于假设的C编译器没有未定义行为的线程可能对那些认为这是一个重要主题的人更感兴趣.


当然,"未定义行为"的经典伪装例子是"鼻子恶魔" - 物理上是不可能的,无论C和C++标准允许什么.

因为C和C++社区倾向于强调未定义行为的不可预测性以及允许编译器在遇到未定义行为时使程序完全做任何事情的想法,所以我假设标准没有任何限制关于行为,以及未定义的行为.

C++标准中相关引用似乎是:

[C++14: defns.undefined]: [..]允许的未定义行为包括完全忽略不可预测的结果,在转换或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式执行,终止转换或执行(发布诊断信息).[..]

这实际上指定了一小组可能的选项:

  • 忽略这种情况 - 是的,标准继续说这会产生"不可预测的结果",但这与编译器插入代码不同(我认为这是一个先决条件,你知道,鼻子恶魔).
  • 以文件化的方式表现环境 - 这实际上听起来相对温和.(我当然没有听说过任何有关鼻腔恶魔的记录.)
  • 终止翻译或执行 - 使用诊断,不能少.那个UB会表现得那么好吗?

我假设在大多数情况下,编译器选择忽略未定义的行为; 例如,当读取未初始化的内存时,可能是插入任何代码以确保一致行为的反优化.我认为陌生人类型的未定义行为(例如" 时间旅行 ")将属于第二类 - 但这需要记录这些行为并"环境特征"(所以我猜鼻腔恶魔只能由地狱计算机?).

我误解了这个定义吗?这些仅仅是可能构成未定义行为的例子,而不是一个全面的选项列表吗?"任何可能发生的事情"的说法仅仅意味着忽视这种情况的意外副作用吗?

编辑:两个小问题澄清:

  • 我认为从原始问题中可以清楚地看出,我认为对大多数人来说都是如此,但无论如何我都会拼出来:我确实意识到"鼻子恶魔"是诙谐的.
  • 请不要写的(其他)答案解释UB允许特定于平台的编译器优化,除非你解释它是如何允许的优化,实现定义的行为也不会允许.

c c++ undefined-behavior language-lawyer

93
推荐指数
6
解决办法
6796
查看次数

C 和 C++ 之间的“if”语句语法差异

if (1) int a = 2;
Run Code Online (Sandbox Code Playgroud)

这行代码是有效的 C++ 代码(至少可以编译)但无效的 C 代码(无法编译)。我知道语言之间存在差异,但这一差异是出乎意料的。

我一直以为语法是

if (expr) statement
Run Code Online (Sandbox Code Playgroud)

但这将使其在两者中都有效。

我的问题是:

  1. 为什么这个不能用 C 编译?
  2. 为什么会存在这种差异呢?

c c++ cross-language language-lawyer

93
推荐指数
4
解决办法
8385
查看次数

使用%p打印空指针是未定义的行为?

使用%p转换说明符打印空指针是不确定的行为?

#include <stdio.h>

int main(void) {
    void *p = NULL;

    printf("%p", p);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个问题适用于C标准,而不适用于C实现.

c c99 undefined-behavior language-lawyer c11

92
推荐指数
2
解决办法
4424
查看次数

空引用是否可行?

这段代码是否有效(和定义的行为)?

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++ null reference language-lawyer

91
推荐指数
4
解决办法
10万
查看次数

什么时候额外的括号有效,除了运算符优先级?

C++中的括号用于许多地方:例如,在函数调用和分组表达式中,以覆盖运算符优先级.除了非法的额外括号(例如函数调用参数列表周围)之外,C++的一般但非绝对规则是额外的括号永远不会受到伤害:

5.1主要表达式[expr.prim]

5.1.1一般[expr.prim.general]

6带括号的表达式是一个主表达式,其类型和值与所附表达式的类型和值相同.括号的存在不会影响表达式是否为左值.除非另有说明,否则带括号的表达式可以在与可以使用所包含的表达式的上下文完全相同的上下文中使用,并且具有相同的含义.

问题:在哪些上下文中,额外的括号会改变C++程序的含义,而不是覆盖基本的运算符优先级?

注意:我认为没有括号的指针到成员语法的限制&qualified-id超出了范围,因为它限制了语法而不是允许两个具有不同含义的语法.同样,在预处理程序宏定义中使用括号也可以防止不必要的运算符优先级.

c++ c++-faq parentheses language-lawyer c++11

91
推荐指数
1
解决办法
6630
查看次数