感觉有点被“C语言编程”一书搞糊涂了(Stephen Kochan)

时间:2014-01-23 21:17:24

标签: c styles

我一直在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;
}

4 个答案:

答案 0 :(得分:1)

  

为什么在没有任何实际参数的情况下调用test()函数?重点是什么?

这里test被声明为函数(void返回类型),它期望类型的参数指向int

  

在这样的循环中,我更习惯于“t ++”。据我所知,在某些情况下,++ t与t ++不同。在循环中编写++ t只会让我发疯“

请注意,当语句中的变量(t++;++t)递增或递减时,预增量和后增量具有相同的效果。
当这些表达式出现在大表达式或复杂表达式中时,可以看到差异(int x = t++int x = ++tt的相同值有不同的结果。

  

写“t == 4”是不正常的?这让我又疯了!

4 == tt == 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中详细了解++tt++之间的区别。它在这段代码中没有任何区别。结果将是相同的。

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分配的值4t:一种特别危险的副作用。我个人虽然发现4 == t混淆了。