我从网上找到了这个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
在上面的程序中起作用吗?
考虑以下功能:
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
在阅读它的点不未定义行为的价值,但我不知道这是否是可能的.
我有以下代码:
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) 如果我有这样的结构:
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程序编译成一个名为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的新手并且在命令行中工作.
我今天遇到了这种语法,无法理解其含义:
// 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)
有人可以对此有所了解吗?
我有一些使用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来计算最终操作)?
所以我最近开始在一个新的工作场所,我遇到了一种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) 为什么这种模式无法编译:
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