感觉对《C语言编程》(Stephen Kochan)这本书有些困惑。

3

我一直在通过一个朋友推荐的书籍自学C语言编程。这本书的名字是Stephen Kochan的"Programming in C"。

我有Java编程背景,在阅读Stephen的书时,我对其中编写代码的方式感到有些困惑。例如下面的代码,我在评论中表达了我的疑惑。也许我错过了一些重要的东西,所以我想听听大家对在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;
}

不需要 void test(int *int_pointer); - γηράσκω δ' αεί πολλά διδασκόμε
4个回答

1

在这里为什么不使用真正的参数调用test()函数?有何意义?

这里声明了test作为一个带有指向int类型的指针参数的函数(返回值类型为void)。

我更习惯像这样在循环中写"t++"。我知道在某些情况下++t与t++是不同的。在循环中写++t就让我发疯。

注意,在语句中单独递增或递减变量(t++;++t)时,前缀递增和后缀递增具有相同的效果。
当这些表达式出现在大型或复杂的表达式中时,可以看到它们的区别(对于相同的t值,int x = t++int x = ++t有不同的结果)。

难道不写成"t == 4"才是正常的吗??这又让我发疯了!

"

4 == tt == 4更安全,尽管两者意思相同。在t == 4的情况下,如果用户不小心输入了t = 4,编译器不会抛出任何错误,你可能会得到错误的结果。而在4 == t的情况下,如果用户不小心输入了4 = t,编译器会警告你:

"
 lvalue is required as left operand of assignment operator.

1
你可能注意到第一条评论中的内容是一个函数声明,而不是调用。 - Dark Falcon

1
请先阅读有关指针的内容,然后您就会明白在这里传递了一个指向int的指针作为参数...
void test(int *int_pointer); 

您可以在this link中清楚地看到++tt++之间的区别。在此代码中没有区别,结果将是相同的。

if(4 == t)if(t == 4)相同,只是不同的写法风格。4 == t通常用于避免输入=而不是==,如果您写4 = t,编译器会报错,但如果您写t = 4则不会出错。


1
// 为什么在这里调用test()函数没有实际参数?有什么意义吗? 这不是调用,而是函数声明。在此位置完全不必要,因为该函数在几行之前已经定义了。在现实世界中,这种声明并不常用。
// 我更习惯在循环中使用"t++"。我知道++t在某些情况下与t++不同。在循环中写++t让我发疯 在这种情况下,它们是等效的,但如果你考虑转向C++,最好完全切换到++t形式,因为在某些情况下(例如使用迭代器时)会有所区别。
// 写"t == 4"不是很正常吗?这又让我疯了! 有些人倾向于使用4 == t来避免t = 4被误用成t == 4的问题(在C中两者都是有效的if条件)。由于所有正常的编译器都会对t = 4发出警告,因此4 == t是不必要的。

1

void test(int *int_pointer);是一个函数原型。在这个特定的例子中,它不是必需的,因为函数在main()上面已经被定义了,但是如果test在文件后面定义,你就需要它(虽然不一定要在函数体内)。 (有些人依赖于隐式声明,但我们不在这里讨论这个问题。)

++t永远不会比t++慢,因为从概念上讲,后者必须存储并返回先前的值。(大多数编译器会优化掉复制操作,尽管我不喜欢依赖于此:我总是使用++t,但很多有经验的程序员不这样做。)

4 == t通常用于代替t == 4,以防意外遗漏其中一个=。虽然很容易犯错,但一旦你花了一两天的时间追踪由单个=引起的错误,你就不会再犯同样的错误了!4 = t将生成编译错误,但t = 4实际上是一个值为4的表达式,它将比较true赋值t4 == t让人难以理解。请注意保留html标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接