假设我们有这个表达式:
#define cube(x) x * x * x
Run Code Online (Sandbox Code Playgroud)
然后我们称之为:
int n = 3, v;
v = cube(n + 1); // v = 10
v = cube((n + 1)); // v = 64
v = cube(n); // v = 27
Run Code Online (Sandbox Code Playgroud)
所以问题是:为什么第一次操作不做v = 64?
这个程序打印出-8 -4但我想知道为什么以及为什么不是编译器显示有关使用哪个函数的错误?为什么结果不同.我对定义这样的函数知之甚少,也可以解释一下
#include <stdio.h>
#include <stdlib.h>
int foo(int x, int y);
#define foo(x, y) x/y + x
int main() {
int i = -6, j = 3;
printf("%d ", foo(i + j, 3));
#undef foo
printf("%d\n", foo(i + j, 3));
}
int foo(int x, int y) {
return x/y + x;
}
Run Code Online (Sandbox Code Playgroud) 任何人都可以解释我为什么我得到的输出是64,而不是4?
#include <stdio.h>
#define square(m) m*m
int main()
{
int i;
i=64/square(4);
printf("%d",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我写了以下C代码.但是在运行时它给了我不正确的变量值sb,所以我尝试用GDB调试它,我发现int division E(vdes->addr, bs)(#define E(X,Y) X/Y)的汇编代码是完全不可理解的,似乎没有做正确的事情.
文件:main.c
typedef struct virtual_file_descriptor
{
int dfb;
int addr;
} vfd;
vfd vdes;
if(!strcmp(argv[1], "write")){
vdes.dfb = atoi(argv[2]);
vdes.addr = atoi(argv[3]);
vwrite(&vdes, inbuffer, atoi(argv[4]));
}
Run Code Online (Sandbox Code Playgroud)
文件:vwrite.c
#define E(X,Y) X/Y
#define bs sizeof(D_Record)*MAX_BLOCK_ENTRIES
int vwrite(vfd *vdes, char *buffer, int size){
if(!vdes)
return -1;
int sb, nb, offset;
sb = E(vdes->addr, bs) + 1; // i did 140/280 => wrong result
offset = vdes->addr - (sb - 1) * bs;
printf("size=%d …Run Code Online (Sandbox Code Playgroud) #include <iostream>
using namespace std;
#define squareOf(x) x*x
int main() {
// your code goes here
int x;
cout<<squareOf(x+4);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为答案会是16,但它的结果为4.我很困惑这是如何工作的.
以下程序正在打印 49
#include <stdio.h>
#define SQR(x) (x*x)
void main(void) {
int x, y; x = 5;
y = SQR(++x);
printf("y is %d\n", y);
}
Run Code Online (Sandbox Code Playgroud)
我不明白我错过了什么.
这里就是我理解它是如何可能是工作
在SQR(++x), ++x将被评估为6之后x*x的36应退还.
因此y = 36
,答案是49