小编200*_*ess的帖子

当在C89模式下编译时,以下程序如何输出`C89`和在C99模式下编译时输出`C99`?

我从网上找到了这个C程序:

#include <stdio.h>

int main(){

    printf("C%d\n",(int)(90-(-4.5//**/
    -4.5)));

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

这个程序的有趣之处在于,当它在C89模式下编译和运行时,它会打印C89,当它被编译并在C99模式下运行时,它会打印出来C99.但我无法弄清楚这个程序是如何工作的.

你能解释一下第二个参数如何printf在上面的程序中起作用吗?

c printf comments c99 c89

125
推荐指数
3
解决办法
5605
查看次数

为什么0 [0]语法上有效?

为什么这行在javascript中有效?

var a = 0[0];
Run Code Online (Sandbox Code Playgroud)

在那之后,aundefined.

javascript

119
推荐指数
5
解决办法
6639
查看次数

为什么C++编译器不优化这个条件布尔赋值作为无条件赋值?

考虑以下功能:

void func(bool& flag)
{
    if(!flag) flag=true;
}
Run Code Online (Sandbox Code Playgroud)

在我看来,如果flag有一个有效的布尔值,这相当于无条件设置它true,如下所示:

void func(bool& flag)
{
    flag=true;
}
Run Code Online (Sandbox Code Playgroud)

然而,gcc和clang都没有这样优化它 - 都在-O3优化级别生成以下内容:

_Z4funcRb:
.LFB0:
    .cfi_startproc
    cmp BYTE PTR [rdi], 0
    jne .L1
    mov BYTE PTR [rdi], 1
.L1:
    rep ret
Run Code Online (Sandbox Code Playgroud)

我的问题是:只是代码太特殊flag而不关心优化,或者是否有任何好的理由为什么这样的优化是不希望的,因为它不是一个参考volatile?看来这可能是唯一的原因是,flag可以在某种程度上具有非true-或- false在阅读它的点不未定义行为的价值,但我不知道这是否是可能的.

c++ optimization

116
推荐指数
3
解决办法
6923
查看次数

在将标题分为8个方向时,如何避免if/else if chain?

我有以下代码:

if (this->_car.getAbsoluteAngle() <= 30 || this->_car.getAbsoluteAngle() >= 330)
  this->_car.edir = Car::EDirection::RIGHT;
else if (this->_car.getAbsoluteAngle() > 30 && this->_car.getAbsoluteAngle() <= 60)
  this->_car.edir = Car::EDirection::UP_RIGHT;
else if (this->_car.getAbsoluteAngle() > 60 && this->_car.getAbsoluteAngle() <= 120)
  this->_car.edir = Car::EDirection::UP;
else if (this->_car.getAbsoluteAngle() > 120 && this->_car.getAbsoluteAngle() <= 150)
  this->_car.edir = Car::EDirection::UP_LEFT;
else if (this->_car.getAbsoluteAngle() > 150 && this->_car.getAbsoluteAngle() <= 210)
  this->_car.edir = Car::EDirection::LEFT;
else if (this->_car.getAbsoluteAngle() > 210 && this->_car.getAbsoluteAngle() <= 240)
  this->_car.edir = Car::EDirection::DOWN_LEFT;
else if (this->_car.getAbsoluteAngle() > 240 && this->_car.getAbsoluteAngle() <= …
Run Code Online (Sandbox Code Playgroud)

c++ if-statement

111
推荐指数
8
解决办法
1万
查看次数

将结构初始化为0

如果我有这样的结构:

typedef struct
{
    unsigned char c1;
    unsigned char c2;
} myStruct;
Run Code Online (Sandbox Code Playgroud)

将此结构初始化为0的最简单方法是什么?以下是否足够?

myStruct _m1 = {0};
Run Code Online (Sandbox Code Playgroud)

或者我需要将每个成员显式初始化为0吗?

myStruct _m2 = {0,0};
Run Code Online (Sandbox Code Playgroud)

c struct initialization

104
推荐指数
4
解决办法
14万
查看次数

当输出重定向到文件时,printf()和system()的结果顺序错误

我有一个C程序编译成一个名为myprogram的可执行文件.这是它的主要功能:

int main(int argc, char ** argv) {
  printf("this is a test message.\n");
  system("ls");

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

当我myprogram > output.txt在Linux shell中运行然后检查output.txt时,我看到ls上面列出的输出"这是一条测试消息".

我觉得应该是相反的方式.为什么会发生这种情况,我能做些什么,以便"这是一条测试消息"出现在output.txt的顶部?

如果重要的话,我是C的新手并且在命令行中工作.

c linux printf child-process io-redirection

98
推荐指数
3
解决办法
4834
查看次数

在GNU C宏envSet(名称)中,(void)""名称是什么意思?

我今天遇到了这种语法,无法理解其含义:

// Uses the GNU C statement expression extension
#define envSet(name) ({ \
static int initialised; \
static bool set; \
(void) "" name; \
if (!initialised || !g_cacheEnv) { \
    const char *value = getenv(name); \
    set = value != NULL; \
    initialised = true; \
} \
set; \
})
Run Code Online (Sandbox Code Playgroud)

我无法理解的具体路线是:

(void) "" name; \
Run Code Online (Sandbox Code Playgroud)

有人可以对此有所了解吗?

c macros gcc c-preprocessor

65
推荐指数
3
解决办法
2147
查看次数

如何使用Java 8 Optionals,如果三者都存在则执行操作?

我有一些使用Java Optionals的(简化)代码:

Optional<User> maybeTarget = userRepository.findById(id1);
Optional<String> maybeSourceName = userRepository.findById(id2).map(User::getName);
Optional<String> maybeEventName = eventRepository.findById(id3).map(Event::getName);

maybeTarget.ifPresent(target -> {
    maybeSourceName.ifPresent(sourceName -> {
        maybeEventName.ifPresent(eventName -> {
            sendInvite(target.getEmail(), String.format("Hi %s, $s has invited you to $s", target.getName(), sourceName, meetingName));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不用说,这看起来很糟糕.但我想不出另一种以较少嵌套和更易读的方式做到这一点的方法.我考虑过流式传输3个选项,但放弃了这个想法,因为做了.filter(Optional::isPresent)一个.map(Optional::get)感觉甚至更糟.

那么是否有更好的,更"Java 8"或"可选识字"的方式来处理这种情况(基本上需要多个Optionals来计算最终操作)?

java optional java-8

54
推荐指数
7
解决办法
1万
查看次数

这些多余的花括号的目的是什么?

所以我最近开始在一个新的工作场所,我遇到了一种javascript格式,让我质疑它的目的.(特别是括号{})

var _occurrences = getOccurrences($('#ddlTours').val());
{
    var _occurrence = getObjectByValue(_occurrences, 'tourID', booking.tourID);
    {
        _occurrenceID = _occurrence.occurrenceID;
    }
}
Run Code Online (Sandbox Code Playgroud)

对我来说,它几乎看起来像一个尝试对象的构造.即

var _occurrences : // Ignoring = getOccurrences($('#ddlTours').val());
{
    _occurrence : // Ignoring getObjectByValue(_occurrences, 'tourID', booking.tourID);
    {
        _occurrenceID : _occurrence.occurrenceID;
    }
}
Run Code Online (Sandbox Code Playgroud)

但据我所知,它会执行它.

var _occurrences = getOccurrences($('#ddlTours').val());
var _occurrence = getObjectByValue(_occurrences, 'tourID', booking.tourID);
_occurrenceID = _occurrence.occurrenceID;
Run Code Online (Sandbox Code Playgroud)

或者它是如此_occurrence得到删除并且不会被封装,我们分配一个在封装之外的var.这实际上是否可以改善绩效?即

Global var a = 1
{
    b = someFunction()  // After execution because of encapsulation it poofs???
    for(var c in b)
    {
        a += c.somefunction() …
Run Code Online (Sandbox Code Playgroud)

javascript

46
推荐指数
3
解决办法
2836
查看次数

编译具有字符类和字边界的详细Java正则表达式时出错

为什么这种模式无法编译:

Pattern.compile("(?x)[ ]\\b");
Run Code Online (Sandbox Code Playgroud)

错误

ERROR java.util.regex.PatternSyntaxException:
Illegal/unsupported escape sequence near index 8
(?x)[ ]\b
        ^
at java_util_regex_Pattern$compile.call (Unknown Source)
Run Code Online (Sandbox Code Playgroud)

虽然以下相同的工作?

Pattern.compile("(?x)\\ \\b");
Pattern.compile("[ ]\\b");
Pattern.compile(" \\b");
Run Code Online (Sandbox Code Playgroud)

这是Java正则表达式编译器中的错误,还是我遗漏了什么?我喜欢使用[ ]详细的正则表达式而不是反斜杠反斜杠空间,因为它可以节省一些视觉噪音.但显然他们不一样!

PS:这个问题与反斜杠无关.它是关于使用包含单个空格[ ]而不是使用反斜杠的字符类在冗长的正则表达式中转义空格.

不知何故,verbose正则表达式(?x)和包含单个空格的字符类的组合会抛弃[ ]编译器并使其无法识别单词边界转义\b


使用Java测试高达1.8.0_151

java regex verbose

45
推荐指数
5
解决办法
1764
查看次数