问题标签 [kernighan-and-ritchie]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
kernighan-and-ritchie - K&R 练习 2-6 真正需要什么功能?
练习 2-6。编写一个函数 setbits(x,p,n,y) 返回 x,其中从位置 p 开始的 n 位设置为 y 的最右边 n 位,其他位保持不变。
我一直试图在纸上处理这个功能一两个小时,但我没有得到任何结果。
我解释该函数的方式是,任意长度的位字段 x 是从最右边的n
位开始查看它的位。p
将这些n
位更改为位于n
任意长度位字段 y 中最右侧位中的相同位。
示例:p = 7
n = 9
以 x 作为顶场,y 是中间,结果是底场。
我无法确定如何使用任意大小的位字段来做到这一点。我应该使用sizeof(x) * 8
还是没有必要?
我将不胜感激您可以提供有关如何实现此类功能的任何提示。
我还想知道这个练习的任何其他解释,可能是一个更容易的版本,尽管我确信这个可以完成。考虑到我花了多长时间,我希望能就此事发表第二意见,谢谢。
c - K&R 练习 2-7 中的位反转功能
C 编程语言的练习 2-7 :
编写一个函数
invert(x,p,n)
,返回从反转位置开始x
的n
位p
(即,1 变为 0,反之亦然),其他保持不变。
我理解这样的问题:我有 182 是101(101)10
二进制的,括号中的部分必须反转而不改变其余部分。返回值应该是10101010
then,即十进制的 170。
这是我的尝试:
这似乎是正确的(对我来说),但invert(182, 4, 3)
输出536870730
. getbits()
工作正常(直接来自书中)。我写下了我分配给的表达式中发生的事情y
:
应该是正确的,但事实并非如此。我发现这是出错的地方:((~xpn << (p+1)) >> n)
. 我不明白怎么做。
另外,我不知道这段代码有多通用。我的首要任务是让这个案子运作起来。也欢迎在这个问题上提供帮助。
c - EOF 练习 1-6 K&R C 编程语言
这直接取自 K&R 书:
的优先级
!=
高于 的=
,这意味着在没有括号的情况下,关系测试!=
将在赋值之前完成=
。所以声明相当于
这具有将 c 设置为 0 或 1 的不良影响,具体取决于 getchar 的调用是否返回文件结尾。(在第 2 章中有更多内容。)
练习 1-6。验证表达式
getchar() != EOF
是 0 还是 1。
我无法理解如何做这个练习以及理解被引用的段落是怎么回事。
我知道 EOF 是 int 类型的符号常量,通常保持值 -1。由于负值 int 在进行比较时永远不能保持与 char 相同的值,因此需要将其提升为 int ,然后以某种方式发出文件结束的信号。
我也知道没有上面指定的括号,比较!=
是在分配之前完成的,但这实际上是什么意思?该功能发生了什么?我还打印了 EOF 的值,它是 -1 当它说验证它是 0 还是 1 时,这个练习意味着什么?
c - K&R C书中的atoi函数
我对 K&R C 第 2 版中的 atoi() 函数示例有一些问题。只能使用 0 到 9 的字符。但是在我的程序逻辑的某个地方我做错了。
所以里面有这个功能:
以下是我得到的错误:
c - char * argv[] 是什么意思?
我是 C 编程新手,遇到了一个问题。
如果声明复杂,我发现了这个
这意味着daytab
是数组的名称,并且数组的名称指向数组的第一个元素。数组名称与等指针操作不兼容daytab++
(如果我错了,请纠正我)。
但我发现这段代码是用 Dennis Ritchie 写的
他们怎么能操纵argv
?不是数组名吗?
c - 给指针赋值?
在丹尼斯里奇我发现了这个,
那么这四个表达式是等价的:
r.pt1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x
因为运算符从左到右关联。
不应该是 struct rect *rp = &r 吗?
c - 全局声明的变量是外部的还是静态的?
我在c中研究过使用关键字extern的变量是外部引用
的,例如:
Prog1.c Prog2.c
这两个程序一起成功编译。这是否意味着 Prog2.c 中的变量 a 也具有外部链接(外部引用)?
main(){
extern int a ;
a=2;
}
int a=3;
但是在 dennis ritchie pg-195 第 a4.1 节中写到,在所有块之外声明的对象,与函数定义处于同一级别,始终是静态的,我认为静态意味着内部链接,那么上述程序中到底发生了什么?
c - 使用 K&R 样式函数定义时出错
我在编译时收到以下错误。我知道这听起来不对,但是编译器试图传达的确切消息是什么:错误:'fun' 错误的类型冲突:以前的 fun 声明在这里:
c - 分配有小数的变量怎么可能与实际小数的行为方式不同?
棘手的问题是char longest[]
数组初始化。如果我把它写成 ( char longest[lim]
),EOF 后返回给我的字符串比 长lim
,所以我认为它不会这样工作。但是,如果我明确地将 10 放在那里 ( char longest[10]
) - 它会按我的预期工作并且只返回 10 的第一个字符line
。
int lim = 10; char longest[lim]
在这种情况下,和之间有什么区别?char longest[10]
c - argv 指向指针数组的指针
我对以下段落如何与后面的代码匹配感到困惑:
由于 argv 是指向指针数组的指针,我们可以操作指针而不是索引数组。下一个变体基于递增 argv,它是指向 char 的指针,而 argc 是倒计时的:
不char *argv[]
只是一个指针数组吗?指向指针数组的指针不会写成char *(*argv[])
或类似的东西吗?
作为旁注,通常我发现混合数组和指针的声明相当混乱,这是否正常?