- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#include<stdio.h>
#include<conio.h>
int main(){
char i;
int c;
scanf("%i",&c);
scanf("%c",&i);// catch the new line or character introduced before x number
printf("%i",i);// value of that character
getch();
return(0);
}
程序将以与下一个变量声明(而不是上面的变量声明)相同的方式运行:
这个:
int c;
int *x;
int i;
或者这个:
int *x;
int c;
int i;
只有这样:c变量和i变量之前的x指针。我知道最后的声明没有意义,用 int i 而不是 char i,并且添加了一个甚至不需要的指针。但这是偶然发生的,我想知道这是否只是巧合。
最佳答案
假设代码的其余部分没有任何问题,声明变量的顺序应该没有任何区别。声明的顺序不需要与它们在内存中的布局方式有任何关系。即使确实如此,您也可以通过名称来引用变量;只要您的代码正确,对 i
的引用就是对 i
的引用,编译器将生成正确访问该变量所需的任何代码。
现在如果你这样做:
int i;
scanf("%c", &i);
那么你做错了什么。具有 "%i"
格式的 scanf
需要一个 char*
参数,该参数指向要写入的 char
对象该值将被存储。您给它的是 int*
而不是 char*
。因此,你的程序的行为是未定义的;语言标准没有说明它的行为方式。
那么为什么它看起来工作正常呢?可能发生的情况是 scanf
将 int
对象 i
的地址视为指向 char
的指针>。它可能会指向i
表示的第一个字节;例如,i
可能是 32 位,指针将指向这些位的前 8 位。 (它们可能是高位或低位,具体取决于系统。)
现在,当您打印 i
的值时:
printf("%d\n", i);
i
的内容例如是 1 个字节,由您刚刚读入的任何字符组成,以及 3 个字节的垃圾。这 3 个垃圾字节很可能全部为零,但它们可以是任何东西。如果垃圾字节恰好为 0,并且第一个字节恰好是高位字节(即,您在 big-endian 机器上),那么您可能会得到“正确”的输出。
但不要这样做。由于行为未定义,因此它可以“正确”工作多年,然后在最糟糕的时刻彻底失败。
这里的教训是,C 倾向于假设你知道自己在做什么。有很多构造具有未定义的行为,这意味着它们无效,但编译器和运行时系统都不需要告诉您存在问题。与大多数其他语言相比,C 语言更需要程序员将事情做好。编译器(和其他工具)会告诉您一些错误,但不是全部。
在存在未定义行为的情况下,声明变量的顺序可能会产生影响。例如,如果您编写的代码读取或写入超过变量的末尾,那么那里存储的内容可能很重要。但是,在程序运行之前,不要试图随意更改声明。摆脱未定义的行为,因此顺序并不重要。
解决方案:首先不要犯错误。 (当然,说起来容易做起来难。)
命名约定会很有帮助。如果您将 char
变量称为 c
,并将 int
变量称为 i
,而不是反之亦然,那么它会更容易跟踪哪个是哪个。
但是 c
是用于保存输入字符值的 int
变量的合理名称 - 不是用于 scanf
,而是用于 >getchar()
,如:
int c;
while ((c = getchar()) != EOF) {
/* ... */
}
关于c - 变量声明的行为如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8526334/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!