Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-预处理器#定义SQR(x)(x*x)_C_C Preprocessor - Fatal编程技术网

C-预处理器#定义SQR(x)(x*x)

C-预处理器#定义SQR(x)(x*x),c,c-preprocessor,C,C Preprocessor,我想我快疯了。我正在学习C预处理器,但我无法解决这个问题,我特意定义了SQR(x)(x*x),没有括号 #include <stdio.h> #define SQR(x) (x * x) int main() { int counter; /* counter for loop */ for(counter = 0; counter < 5; ++counter) { printf("x %d, x squared %d\n",

我想我快疯了。我正在学习C预处理器,但我无法解决这个问题,我特意定义了SQR(x)(x*x),没有括号

 #include <stdio.h>
 #define SQR(x) (x * x)
 int main()
 {
    int counter; /* counter for loop */
    for(counter = 0; counter < 5; ++counter) 
    {
        printf("x %d, x squared %d\n",counter+1, SQR(counter+1))
    }
    return (0);
 }

我显然遗漏了一些东西,但我无法找出它。

当计数器=3时,它打印为4,因为您打印的是
计数器+1
。使用:

printf("x %d, x squared %d\n",counter, SQR(counter+1));

要查看计数器的实际值是多少。

除了Ignaus的回答中指出的最明显的错误外,还有第二个更隐蔽、更危险的错误。执行预处理器将在
SQR
上执行的替换:

SQR(counter+1)
变成:

counter+1 * counter+1
它将被执行,就像它是这样写的:

counter + (1 * counter) + 1
#define SQR(x) ((x) * (x))
这显然是不正确的,不是你想要的。对于宏,您应该始终将参数括在括号中。因此,您的宏应该如下所示:

counter + (1 * counter) + 1
#define SQR(x) ((x) * (x))
现在再次进行替换,您将获得:

((counter+1) * (counter+1))

这是正确的。养成习惯,总是在括号中包含宏参数,以避免这些错误。

你是对的,它是7。您打印的计数器中添加了一个,因此您的答案与一不匹配。当您打印
x3
计数器是
2
。是的,但打印清楚地显示:“x3,x平方5”,所以我使用compare+1打印,然后将+1与计算进行比较。相同的值是的,我现在可以看到它,谢谢你们抽出时间为什么你们故意不把这些论点放在括号里?你到底有什么理由去做你知道是错误的事情?是的,愚蠢的我谢谢你…@CareyGregory OP说他知道这个问题,他“故意定义SQR(x)(x*x)而没有括号”嗯。。。你是对的;我忽略了这一点。“怎么回事?”CareyGregory不问;)或者:
printf(“x==%d;(x+1)错误地平方==%d\n”,计数器,SQR(计数器+1))。这是一个很好的观点,但是OP说他知道这一点,并且是有目的地阅读一本书,有一个例子表明你需要使用偏执狂,或者类似的事情会发生,但是我想得太多了…@honeyPot你是指括号
()
而不是括号
{}
。是吗?是的,英语不是我的主要语言,所以我打电话给你:D,谢谢你纠正我的错误