请考虑以下switch声明:
switch( value )
{
case 1:
return 1;
default:
value++;
// fall-through
case 2:
return value * 2;
}
Run Code Online (Sandbox Code Playgroud)
此代码编译,但它对C90/C99有效(=已定义的行为)?我从未见过默认情况不是最后一种情况的代码.
编辑:
正如Jon Cage和KillianDS所写:这是非常丑陋和令人困惑的代码,我很清楚它.我只对一般语法(它定义了吗?)和预期输出感兴趣.
我在大学,我们正在使用C项目.我们已经探索过GCC和Clang,而Clang似乎比GCC更加用户友好.因此,我想知道使用clang(而不是GCC)在Linux上使用C和C++进行开发有哪些优点或缺点?
在我的情况下,这将用于学生级程序,而不是生产.
如果我使用Clang,我应该使用GDB调试并使用GNU Make,还是使用其他调试器和make实用程序?
我有两个宏,FOO2并且FOO3:
#define FOO2(x,y) ...
#define FOO3(x,y,z) ...
Run Code Online (Sandbox Code Playgroud)
我想定义一个新的宏FOO如下:
#define FOO(x,y) FOO2(x,y)
#define FOO(x,y,z) FOO3(x,y,z)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为宏不会在参数数量上超载.
无需修改FOO2和FOO3,是有一些方法来定义一个宏FOO(使用__VA_ARGS__或以其他方式),以获得分派的相同的效果FOO(x,y)来FOO2,并FOO(x,y,z)到FOO3?
让我们考虑C和C++中的以下hello world示例:
#include <stdio.h>
int main()
{
printf("Hello world\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <iostream>
int main()
{
std::cout<<"Hello world"<<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我在godbolt中将它们编译为汇编时,C代码的大小只有9行(gcc -O3):
.LC0:
.string "Hello world"
main:
sub rsp, 8
mov edi, OFFSET FLAT:.LC0
call puts
xor eax, eax
add rsp, 8
ret
Run Code Online (Sandbox Code Playgroud)
但是C++代码的大小是22行(g++ -O3):
.LC0:
.string "Hello world"
main:
sub rsp, 8
mov edx, 11
mov esi, OFFSET FLAT:.LC0
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> …Run Code Online (Sandbox Code Playgroud) 是否有任何代码可以在C/C++中找到整数的最大值(相应于编译器),如Integer.MaxValuejava中的函数?
我应该使用哪种格式说明符来打印变量的地址?下面很多我很困惑.
%u - 无符号整数
%x - 十六进制值
%p - 无效指针
哪个是打印地址的最佳格式?
我正在查看1997 年发布的nmap的源代码,我注意到这段代码对我来说看起来有点奇怪:
int i=0, j=0,start,end;
char *expr = strdup(origexpr);
ports = safe_malloc(65536 * sizeof(short));
i++; /* <<<<<< */
i--; /* <<<<<< */
for(;j < exlen; j++)
if (expr[j] != ' ') expr[i++] = expr[j];
expr[i] = '\0';
Run Code Online (Sandbox Code Playgroud)
为什么你们会i++;然后i--;紧跟其后?i是0,则i++轮流i到1。在那之后,i--变成i到0。
链接到原始源代码。搜索:
i++;
i--;
Run Code Online (Sandbox Code Playgroud)
谁能解释一下这是干什么用的?
在C中,我知道我可以使用以下代码在堆上动态分配二维数组:
int** someNumbers = malloc(arrayRows*sizeof(int*));
for (i = 0; i < arrayRows; i++) {
someNumbers[i] = malloc(arrayColumns*sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)
显然,这实际上会创建一个指向一堆独立的一维整数数组的指针的一维数组,而"系统"可以在我要求时找出我的意思:
someNumbers[4][2];
Run Code Online (Sandbox Code Playgroud)
但是,当我静态声明一个2D数组时,如下一行...:
int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS];
Run Code Online (Sandbox Code Playgroud)
...是否在堆栈上创建了类似的结构,还是完全是另一种形式?(即它是指针的一维数组吗?如果没有,它是什么,以及如何计算它的引用?)
另外,当我说"系统"时,究竟是什么负责解决这个问题呢?内核?或者C编译器在编译时对其进行排序?
我是多线程的新手,并试图了解互斥锁的工作原理.很多谷歌和我找到了一个体面的教程,但它仍然有一些怀疑它是如何工作的,因为我创建了自己的程序,其中锁定不起作用.
互斥体的一个绝对非直观的语法是pthread_mutex_lock( &mutex1 );,当看起来互斥锁被锁定时,我真正想要锁定的是其他变量.这种语法是否意味着锁定互斥锁会锁定代码区域,直到互斥锁被解锁?然后线程如何知道该区域被锁定?[ 更新:线程知道该区域被 内存屏蔽锁定 ].这种现象应该被称为临界区吗?[ 更新:关键部分对象仅在Windows中可用,其中对象比互斥锁更快,并且仅对实现它的线程可见.否则,临界区只是指由互斥锁保护的代码区域 ]
简而言之,您能否帮助解决最简单的互斥示例程序以及关于它如何工作的逻辑的最简单的解释?我相信这会帮助很多其他新手.