我一直在C编程中教自己,这本书是由一位在C中很棒的朋友推荐的书。书名是由Stephen Kochan编写的“Programming in C”。
我有Java的背景,我对斯蒂芬的书中编写代码的方式感到有点疯狂。例如,下面的代码,我在其中评论了我的困惑。也许我在这里缺少一些重要的东西,所以我希望听到一些有关C语言编码方法的输入。
#include <stdio.h>
void test(int *int_pointer)
{
*int_pointer = 100;
}
int main(void)
{
void test(int *int_pointer); // why call the test() function here without any real argument? what's the point?
int i = 50, *p = &i;
printf("Before the call to test i = %i\n", i);
test(p);
printf("After the call to test i = %i\n", i);
int t;
for (t = 0; t < 5; ++t) // I'm more used to "t++" in a loop like this. As I know ++t is different than t++ in some cases. Writting ++t in a loop just drives me crazy
{
if (4 == t) // isn't it normal to write "t == 4" ?? this is driving me crazy again!
printf("skip the number %i\n", t);
else
printf("the value of t is now %i\n", t);
}
return 0;
}
答案 0 :(得分:1)
为什么在没有任何实际参数的情况下调用
test()
函数?重点是什么?
这里test
被声明为函数(void
返回类型),它期望类型的参数指向int
。
在这样的循环中,我更习惯于“t ++”。据我所知,在某些情况下,++ t与t ++不同。在循环中编写++ t只会让我发疯“
请注意,当语句中的变量(t++;
或++t
)递增或递减时,预增量和后增量具有相同的效果。
当这些表达式出现在大表达式或复杂表达式中时,可以看到差异(int x = t++
和int x = ++t
对t
的相同值有不同的结果。
写“t == 4”是不正常的?这让我又疯了!
4 == t
比t == 4
更安全,尽管两者具有相同的含义。如果是t == 4
,如果用户意外地键入t = 4
,则编译器不会抛出任何错误,您可能会得到错误的结果。在4 == t
的情况下,如果用户意外键入4 = t
,编译器会通过您发出警告,如:
lvalue is required as left operand of assignment operator.
答案 1 :(得分:1)
请阅读有关指针的内容,然后您将了解到指向int的指针已在此处作为参数传递...
void test(int *int_pointer);
您可以在this link中详细了解++t
和t++
之间的区别。它在这段代码中没有任何区别。结果将是相同的。
if(4 == t)
与if(t == 4)
相同。只是写作风格不同。 4 == t
主要用于避免键入=
而不是==
。如果你写4 = t
编译器会抱怨,但如果你写t = 4
答案 2 :(得分:1)
//为什么在没有任何实际参数的情况下调用test()函数?重点是什么? 它不是一个调用,它是函数声明。完全没必要在这个位置,因为函数之前定义了几行。在现实世界中,这种声明并不经常使用。
//我在这样的循环中习惯于“t ++”。据我所知,在某些情况下,++ t与t ++不同。在循环中编写++ t只会让我发疯 在这种情况下它们是等价的,但是如果你想要使用C ++,最好完全切换到++ t形式,因为在某些情况下(例如使用迭代器)它会产生差异。
//写“t == 4”是不正常的?这让我再次疯狂!
有些人倾向于使用4 == t来避免在使用t = 4
而不是t == 4
时出现问题(两者在C中都有效if
条件)。由于所有正常编译器都会发出t = 4
的警告,因此4 == t
是不必要的。
答案 3 :(得分:1)
void test(int *int_pointer);
是一个函数原型。在这个特定实例中不需要它,因为函数是在main()
之上定义的,但是如果test
在文件中稍后定义,则需要它(尽管不一定在函数体中)。 (有些人依赖于隐含的声明,但我们不会在这里进入。)
++t
永远不会慢于t++
,因为从概念上讲,后者必须存储并返回之前的值。 (大多数编译器会优化副本,虽然我不想依赖它:我总是使用++t
但是很多有经验的程序员都没有。{/ p>
4 == t
通常用于代替t == 4
,以防您意外省略其中一个=
。它很容易完成,但是一旦你花了一两天的时间来寻找一个由=
代替==
引起的错误,你就不会再这样做了! 4 = t
会生成编译错误,但t = 4
实际上是值为4的表达式,它将比较true
和分配的值4
到t
:一种特别危险的副作用。我个人虽然发现4 == t
混淆了。