Questions tagged «c»

C是用于系统编程(OS和嵌入式),库,游戏和跨平台的通用编程语言。该标记应与ISO 9899标准(除非另有说明,最新版本9899:2018中定义的有关C语言的一般问题)一起使用-还要使用c89,c99,c11等标记特定于版本的请求。C与C ++截然不同,在没有合理理由的情况下,不应将其与C ++标记结合使用。

11
负数模运算
在C程序中,我正在尝试以下操作(只需检查行为) x = 5 % (-3); y = (-5) % (3); z = (-5) % (-3); printf("%d ,%d ,%d", x, y, z); 给我的输出与(2, -2 , -2)gcc中的一样。我每次都期待一个积极的结果。模数可以为负吗?有人可以解释这种行为吗?
191 c  gcc  modulo 


12
在没有/ proc / self / exe的情况下查找当前可执行文件的路径
在我看来,Linux使用/ proc / self / exe很容易。但是我想知道是否有一种方便的方法可以通过跨平台接口在C / C ++中找到当前应用程序的目录。我已经看到一些项目与argv [0]混为一谈,但它似乎并不完全可靠。 例如,如果您必须支持没有/ proc /的Mac OS X,您会怎么做?使用#ifdefs隔离特定于平台的代码(例如,NSBundle)?还是尝试从argv [0],$ PATH和诸如此类的东西推断出可执行文件的路径,冒着在边缘情况下发现错误的风险?
190 c++  c  linux  macos  executable 

19
我可以在C或C ++中使用二进制文字吗?
我需要使用一个二进制数。 我试着写: const x = 00010000; 但这没有用。 我知道我可以使用与值相同的十六进制数00010000,但是我想知道C ++中是否存在用于二进制数的类型,如果没有,那么是否存在针对我的问题的另一种解决方案?
190 c++  c  binary 

3
十六进制的printf()格式
这比一个重要的问题更有趣,但是为什么在将十六进制打印为带有前导零的8位数字时,为什么%#08X显示的结果不相同0x%08X? 当我尝试使用前者时,08格式设置标记已删除,并且只适用于8。 再一次,我只是好奇。
190 c  printf  hex 

6
数组的地址如何等于C中的值?
在下面的代码位中,指针值和指针地址与预期的不同。 但是数组值和地址不行! 怎么会这样? 输出量 my_array = 0022FF00 &my_array = 0022FF00 pointer_to_array = 0022FF00 &pointer_to_array = 0022FEFC #include <stdio.h> int main() { char my_array[100] = "some cool string"; printf("my_array = %p\n", my_array); printf("&my_array = %p\n", &my_array); char *pointer_to_array = my_array; printf("pointer_to_array = %p\n", pointer_to_array); printf("&pointer_to_array = %p\n", &pointer_to_array); printf("Press ENTER to …
189 c  pointers  arrays 

12
转发C中可变参数函数的调用
在C语言中,是否可以转发可变函数的调用?如 int my_printf(char *fmt, ...) { fprintf(stderr, "Calling printf with fmt %s", fmt); return SOMEHOW_INVOKE_LIBC_PRINTF; } 在这种情况下,显然不必严格按照上述方式转发调用(因为您可以通过其他方式记录调用或使用vfprintf),但是我正在使用的代码库要求包装程序执行一些实际的工作,并且没有(也没有增加)类似于vfprintf的辅助函数。 [更新:根据到目前为止提供的答案,似乎有些困惑。为了那句问题的另一种方式:在一般情况下,你可以用一些任意可变参数函数,而无需修改函数的定义。]
189 c  variadic 

13
C并不那么难:void(*(* f [])())()
我今天刚看一张照片,并认为我会感谢您的解释。所以这是图片: 我感到困惑,并想知道这样的代码是否可行。我用图片搜索了一下,然后在此 reddit条目中找到了另一张图片,这是该图片: 因此,这种“螺旋式阅读”是否有效?这是C编译器解析的方式吗? 如果对这个怪异的代码有更简单的解释,那就太好了。 除此以外,这类代码是否有用?如果是这样,何时何地? 关于“螺旋规则” 存在一个问题,但我不仅在询问它的应用方式或如何使用该规则读取表达式。我也质疑这种表达方式的使用以及螺旋规则的有效性。关于这些,已经发布了一些不错的答案。

25
四舍五入到2的下一位
我想编写一个函数,该函数返回最接近的2的下一个幂。例如,如果我的输入为789,则输出应为1024。是否有任何方法可以在不使用任何循环而仅使用一些按位运算符的情况下实现这一目标?


5
尝试使用const初始化变量时出现错误“初始化元素不恒定”
我在以下程序的第6行(将my_foo初始化为foo_init)收到错误,我不确定我理解为什么。 typedef struct foo_t { int a, b, c; } foo_t; const foo_t foo_init = { 1, 2, 3 }; foo_t my_foo = foo_init; int main() { return 0; } 请记住,这是我正在处理的较大的多文件项目的简化版本。目标是在目标文件中具有一个常数,多个文件可用于初始化状态结构。由于它是资源有限的嵌入式目标,并且结构不是那么小,我不希望源代码有多个副本。我不想使用: #define foo_init { 1, 2, 3 } 我也在尝试编写可移植的代码,因此我需要一个有效的C89或C99解决方案。 这与目标文件中的ORG有关吗?那些初始化变量进入一个ORG,并通过复制第二个ORG的内容进行初始化? 也许我只需要改变自己的策略,并具有初始化功能即可在启动时完成所有副本。除非那里还有其他想法?
186 c  initialization 

3
fork()分支比预期更多?
考虑以下代码: #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i = 0; i < 2; i++) { fork(); printf("."); } return 0; } 该程序输出8个点。那怎么可能呢?应该不应该有6个点?
186 c++  c  fork 


1
如何引导GCC和g ++?
这一直困扰着我一段时间。GCC和g ++如何自行编译? 我猜每个修订都使用以前构建的修订进行编译。这是真的?如果是的话,是否意味着最旧的g ++和GCC版本是用汇编编写的?

3
为什么GCC对于几乎相同的C代码生成如此根本不同的汇编?
在编写优化ftol函数时,我在中发现了一些非常奇怪的行为GCC 4.6.1。首先让我向您展示代码(为清楚起见,我标记了不同之处): fast_trunc_one,C: int fast_trunc_one(int i) { int mantissa, exponent, sign, r; mantissa = (i & 0x07fffff) | 0x800000; exponent = 150 - ((i >> 23) & 0xff); sign = i & 0x80000000; if (exponent < 0) { r = mantissa << -exponent; /* diff */ } else { r …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.