在阅读有关未定义行为和序列点的答案后,我写了一个小程序:
#include <stdio.h>
int main(void) {
int i = 5;
i = (i, ++i, 1) + 1;
printf("%d\n", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是2.天啊,我没有看到减量来了!这里发生了什么?
另外,在编译上面的代码时,我收到一条警告:
px.c:5:8:警告:逗号表达式的左侧操作数无效
Run Code Online (Sandbox Code Playgroud)[-Wunused-value] i = (i, ++i, 1) + 1; ^
为什么?但可能会通过我的第一个问题的答案自动回答.
为什么在阅读时scanf()需要l" %lf" double,何时printf()可以使用" %f",无论其参数是a double还是a float?
示例代码:
double d;
scanf("%lf", &d);
printf("%f", d);
Run Code Online (Sandbox Code Playgroud) 我试图比较内联汇编语言和C++代码的性能,所以我写了一个函数,添加两个大小为2000的数组,持续100000次.这是代码:
#define TIMES 100000
void calcuC(int *x,int *y,int length)
{
for(int i = 0; i < TIMES; i++)
{
for(int j = 0; j < length; j++)
x[j] += y[j];
}
}
void calcuAsm(int *x,int *y,int lengthOfArray)
{
__asm
{
mov edi,TIMES
start:
mov esi,0
mov ecx,lengthOfArray
label:
mov edx,x
push edx
mov eax,DWORD PTR [edx + esi*4]
mov edx,y
mov ebx,DWORD PTR [edx + esi*4]
add eax,ebx
pop edx
mov [edx + esi*4],eax
inc esi
loop label
dec edi …Run Code Online (Sandbox Code Playgroud) 可能的重复:
当我们定义一个宏时,do(0)有什么用?
为什么在C/C++宏中有时会出现无意义的do/while和if/else语句?
做{...}而(0)有什么好处?
我已经看到一些包含在do/while(0)循环中的多行C宏,如:
#define FOO \
do { \
do_stuff_here \
do_more_stuff \
} while (0)
与使用基本块相反,以这种方式编写代码有什么好处(如果有的话):
#define FOO \
{ \
do_stuff_here \
do_more_stuff \
}
我知道inline是对编译器的提示或请求,用于避免函数调用开销.
那么在什么基础上可以确定函数是否是内联的候选者?在哪种情况下应该避免内联?
根据Linux程序员手册:
brk()和sbrk()改变程序中断的位置,它定义了进程数据段的结束.
这里的数据段意味着什么?是仅仅将数据段或数据,BSS和堆组合在一起?
根据维基:
有时,数据,BSS和堆区域统称为"数据段".
我认为没有理由改变数据段的大小.如果它是数据,BSS和堆集合那么它是有意义的,因为堆将获得更多的空间.
这让我想到了第二个问题.在我到目前为止阅读的所有文章中,作者都说堆积增长,堆栈向下增长.但是他们没有解释的是当堆占用堆和堆栈之间的所有空间时会发生什么?

我试过这个例子:
/* itoa example */
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int i;
char buffer [33];
printf ("Enter a number: ");
scanf ("%d",&i);
itoa (i,buffer,10);
printf ("decimal: %s\n",buffer);
itoa (i,buffer,16);
printf ("hexadecimal: %s\n",buffer);
itoa (i,buffer,2);
printf ("binary: %s\n",buffer);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但那里的例子不起作用(它表示该功能itoa不存在).
从这里发布的问题数量可以清楚地看出,当人们围绕指针和指针算术时,人们会遇到一些非常有趣的问题.
我很想知道为什么.他们从来没有真正给我带来过重大问题(尽管我在新石器时代首次了解它们).为了更好地回答这些问题,我想知道人们发现什么困难.
所以,如果你正在努力使用指针,或者你最近突然"得到它",指针的哪些方面会导致你出现问题?
在ac程序中我正在尝试以下操作(只是检查行为)
x = 5 % (-3);
y = (-5) % (3);
z = (-5) % (-3);
printf("%d ,%d ,%d", x, y, z);
Run Code Online (Sandbox Code Playgroud)
给我输出为(2, -2 , -2)gcc.我每次都期待一个积极的结果.模数可以为负数吗?任何人都可以解释这种行为吗?
在Unix系统上,gcc在哪里查找头文件?
我今天早上花了一点时间寻找一些系统头文件,所以我认为这将是很好的信息.