在C++中,?:运算符比if()... else语句更快?它们在编译代码中有什么区别吗?
我正在查看OpenSSL中使用的一些预处理器宏,我发现了以下内容crypto/stack/safestack.h:
#define CHECKED_STACK_OF(type, p) \
((_STACK*) (1 ? p : (STACK_OF(type)*)0))
#define CHECKED_SK_FREE_FUNC(type, p) \
((void (*)(void *)) ((1 ? p : (void (*)(type *))0)))
#define CHECKED_SK_FREE_FUNC2(type, p) \
((void (*)(void *)) ((1 ? p : (void (*)(type))0)))
Run Code Online (Sandbox Code Playgroud)
我猜它的编写方式可以解决编译器错误(可能是供应商十多年来一直没有支持的古老版本).
使用1上述内容的目的是什么,因为它始终如一?
在下面的代码中,我memset()是一个stdbool.h bool值变量123.(也许这是未定义的行为?)然后我将指向此变量的指针传递给受害者函数,该函数尝试使用条件操作来防止意外值.但是,由于某种原因,GCC似乎完全取消了条件操作.
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
void victim(bool* foo)
{
int bar = *foo ? 1 : 0;
printf("%d\n", bar);
}
int main()
{
bool x;
bool *foo = &x;
memset(foo, 123, sizeof(bool));
victim(foo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
user@host:~$ gcc -Wall -O0 test.c user@host:~$ ./a.out 123
使这个特别恼人的是该victim()函数实际上在库中,如果值大于1则会崩溃.
转载于GCC版本4.8.2-19ubuntu1和4.7.2-5.没有在clang上复制.
当连接到终端时,stdout是行缓冲的,但我记得在某处读取(至少从stdin)将自动刷新stdout.我使用的所有C实现都已经完成了,但我现在无法在标准中找到它.
它确实有意义,它是这样的,否则代码如下:
printf("Type some input: ");
fgets(line, sizeof line, stdin);
Run Code Online (Sandbox Code Playgroud)
需要一个额外的 fflush(stdout);
那么stdout肯定会在这里刷新吗?
编辑:
正如几个回复所说,标准中似乎无法保证我的示例中的stdout输出将在从stdin读取之前出现,但另一方面,这个意图在(我的免费草稿副本)中说明了标准:
交互设备的输入和输出动态应按照7.19.3的规定进行.这些要求的目的是尽快出现无缓冲或行缓冲输出,以确保在程序等待输入之前实际出现提示消息.
(ISO/IEC 9899:TC2委员会草案 - 2005年5月6日,第14页).
所以似乎没有保证,但无论如何它可能适用于大多数实现.(著名遗言...)
在游戏中我有一个玩家列表,让我们这样说:
LinkedList<String> players = new LinkedList<String>();
Run Code Online (Sandbox Code Playgroud)
我想让每个玩家与其他玩家互动,所以我写了两个嵌套循环:
Iterator<String> i1 = players.iterator();
while (i1.hasNext()) {
String p1 = i1.next();
Iterator<String> i2 = players.iterator();
// But I want to do this: Iterator<String> i2 = i1.clone();
while (i2.hasNext()) {
String p2 = i2.next();
System.out.println("Interact: " + p1 + ", " + p2);
}
}
Run Code Online (Sandbox Code Playgroud)
由于我只希望每对玩家互动一次,我想在外圈的当前玩家之后用玩家开始内循环.所以我想克隆迭代器,但是不能编译.
那么,我该怎么做呢?
我们希望使用蓝牙将16个振动器连接到Android手机,并单独控制振动器.
据我所知,你只能在微微网中有8个设备,这样就可以限制7个振动器(手机本身就是第8个设备).首先:这是正确的吗?
在Android中,最多可以有七台连接设备运行良好且可靠吗?或者Android的蓝牙实现或API是否存在一些额外的限制或问题?
对于我们的十六个振动器,我们是否必须使用其他设备构建一个散射网,该设备可以在手机的微微网和一些振动器的附加微微网之间架起桥梁?有没有人有这方面的经验,它是否运作良好?
(不,它不是性玩具!)
我正在编写一个包含世代垃圾收集器的程序.只有两代人.我想知道的是:在进行全面收集时,我是通过先收集年轻的物体,将幸存者提升到老一代,然后收集老一代,或者我只是垃圾收集所有东西来获得任何东西(性能方面)一扫?我不确定人们通常采用哪种方式.
我现在正在使用两步法,因为它实现起来有点简单,但也许一步法更有效?
如果重要的话,垃圾收集器是非复制的.
我目前正在编写一个C to Assembly编译器,它并不意味着实用,但我想为教育价值做这件事.我想知道我何时测试关键字,是否有更有效的方法,而不是只读取文件中的下一个单词,然后通过一堆嵌套if语句来测试关键字.有没有更好的方法?
我编码霍夫曼压缩,它适用于所有扩展的ascii(0-255),但当我打开像mp3这样的非文本文件时,就像在内部那样:
ťîxł¸H... W]`9MČČ˘Ł¤Ąxw
它崩溃了.我测试过它并不是因为输入数据的大小.
它在文件保存时崩溃,继承代码:
for(int i=0;i<=contents.length();i++){
newString +=kod[contents[i]];
}
saveFile("test_nowy.txt", newString);
bool saveFile (string name, string contents)
{
ofstream file;
file.open(name.c_str());
file << contents;
file.close();
}
Run Code Online (Sandbox Code Playgroud)
我还需要说,尽管通过了所有早期的步骤(计算代码等),但结果是错误的.好像我的程序不理解那些字符.