标签: c

是否要求短路逻辑运营商?和评估顺序?

ANSI标准是否要求逻辑运算符在C或C++中被短路?

我很困惑,因为我记得K&R的书说你的代码不应该依赖于这些操作被短路,因为它们可能没有.有人可以指出标准中的哪个位置逻辑操作始终是短路的吗?我最感兴趣的是C++,C的答案也很棒.

我还记得读(不记得在哪里)评估顺序没有严格定义,所以你的代码不应该依赖或假设表达式中的函数将按特定的顺序执行:在语句的末尾所有引用的函数将被调用,但编译器可以自由选择最有效的顺序.

标准是否表明该表达式的评估顺序?

if( functionA() && functionB() && functionC() ) cout<<"Hello world";
Run Code Online (Sandbox Code Playgroud)

c c++ operator-precedence short-circuiting logical-operators

137
推荐指数
5
解决办法
3万
查看次数

使用过时的C编译器存在安全风险吗?

我们有一些生产中没有人关心的构建系统,这些机器运行古老版本的GCC,如GCC 3或GCC 2.

而且我无法说服管理层将其升级到更近期:他们说,"如果没有破产,就不要修理它".

由于我们维护了一个非常古老的代码库(写于80年代),这个C89代码在这些编译器上编译得很好.

但我不确定使用这些旧东西是个好主意.

我的问题是:

可以使用旧的C编译器破坏编译程序的安全性吗?

更新:

相同的代码是由Visual Studio 2008 for Windows目标构建的,而MSVC还不支持C99或C11(我不知道更新的MSVC是否支持),我可以使用最新的GCC在我的Linux机器上构建它.因此,如果我们只是放入一个较新的GCC,它可能会像以前一样好.

c security gcc

137
推荐指数
9
解决办法
9128
查看次数

gdb调试器最棘手/最有用的命令

你可以在运行像gdb或dbx这样的调试器时发布最棘手和最有用的命令.

c unix debugging gdb dbx

136
推荐指数
8
解决办法
4万
查看次数

确定导致分段错误的代码行?

我们如何确定导致分段错误的代码中的错误在哪里?

在编写了一些代码后,为了确定我在哪里有分段错误,我的编译器(gcc)能告诉我程序中的错误位置吗?

c c++ debugging segmentation-fault

136
推荐指数
5
解决办法
16万
查看次数

用scanf读取字符串

我对某些事情有点困惑.我的印象是,读取C字符串的正确方法与之scanf()相符

(不要介意可能的缓冲区溢出,这只是一个简单的例子)

char string[256];
scanf( "%s" , string );
Run Code Online (Sandbox Code Playgroud)

但是,以下似乎也有效,

scanf( "%s" , &string );
Run Code Online (Sandbox Code Playgroud)

这只是我的编译器(gcc),纯粹的运气还是别的什么?

c scanf

136
推荐指数
1
解决办法
50万
查看次数

为什么pthread_cond_wait有虚假的唤醒?

引用手册页:

使用条件变量时,总会有一个布尔谓词,涉及与每个条件等待关联的共享变量,如果线程应该继续,则为真.可能会发生pthread_cond_timedwait()或pthread_cond_wait()函数的虚假唤醒.由于从pthread_cond_timedwait()或pthread_cond_wait()返回并不意味着有关此谓词的值的任何内容,因此应在返回时重新评估谓词.

因此,pthread_cond_wait即使您没有发信号也可以返回.乍一看,这看起来非常残酷.它就像一个随机返回错误值或在实际到达正确的返回语句之前随机返回的函数.这似乎是一个主要的错误.但是他们选择在手册页中记录这一点而不是修复它的事实似乎表明有一个合理的理由为什么pthread_cond_wait最终虚假地唤醒.据推测,它有一些内在的关于它是如何工作的,这使它无法帮助.问题是什么.

为什么没有pthread_cond_wait虚假回报?为什么它不能保证它只是在它被正确发出信号后醒来?谁能解释其虚假行为的原因?

c pthreads

136
推荐指数
4
解决办法
3万
查看次数

为什么在C中写入1000,000,000作为1000*1000*1000?

在Apple创建的代码中,有这一行:

CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )
Run Code Online (Sandbox Code Playgroud)

没有任何理由来表达1,000,000,0001000*1000*1000

为什么不1000^3呢?

c integer objective-c literals

136
推荐指数
6
解决办法
1万
查看次数

C:char指针和数组之间的差异

考虑:

char amessage[] = "now is the time";
char *pmessage = "now is the time";
Run Code Online (Sandbox Code Playgroud)

我从C编程语言第2版​​中读到,上述两个陈述没有做同样的事情.

我一直认为数组是一种操作指针来存储一些数据的便捷方式,但显然情况并非如此...... C中数组和指针之间的"非平凡"差异是什么?

c arrays pointers

135
推荐指数
5
解决办法
5万
查看次数

无法通过这种方式来计算数字的平方

我找到了一个计算数字平方的函数:

int p(int n) {
    int a[n]; //works on C99 and above
    return (&a)[n] - a;
}
Run Code Online (Sandbox Code Playgroud)

它返回n 2的值.问题是,它是如何做到的?经过一点点测试后,我发现之间是(&a)[k]和/ .这是为什么?(&a)[k+1]sizeof(a)sizeof(int)

c arrays pointers c99 variable-length-array

135
推荐指数
4
解决办法
9184
查看次数

为什么C ++的初始分配比C大得多?

当使用相同的代码时,只需更改编译器(从C编译器到C ++编译器)将更改分配的内存量。我不太确定为什么会这样,并且想进一步了解。到目前为止,我得到的最好的答复是“可能是I / O流”,它的描述性不是很强,这使我对C ++的“不用付钱,不用付钱”感到好奇。

我正在使用分别为7.0.1-8和8.3.0-6的Clang和GCC编译器。我的系统在最新的Debian 10(Buster)上运行。基准通过Valgrind Massif完成。

#include <stdio.h>

int main() {
    printf("Hello, world!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所使用的代码不会更改,但是无论我是以C还是C ++进行编译,它都会更改Valgrind基准测试的结果。但是,这些值在编译器之间保持一致。该程序的运行时分配(峰值)如下:

  • GCC(C):1,032字节(1 KB)
  • G ++(C ++):73,744字节(〜74 KB)
  • lang(C):1,032字节(1 KB)
  • Clang ++(C ++):73,744字节(〜74 KB)

为了进行编译,我使用以下命令:

clang -O3 -o c-clang ./main.c
gcc -O3 -o c-gcc ./main.c
Run Code Online (Sandbox Code Playgroud)
clang++ -O3 -o cpp-clang ./main.cpp
g++ -O3 -o cpp-gcc ./main.cpp
Run Code Online (Sandbox Code Playgroud)

对于Valgrind,我运行valgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-lang每种编译器和语言,然后ms_print显示峰。

我在这里做错什么了吗?

c c++ benchmarking

135
推荐指数
2
解决办法
7716
查看次数