All posts by shiji

isset() vs empty() vs is_null()

PHP has different functions which can be used to test the value of a variable. Three useful functions for this are isset()empty() and is_null(). All these function return a boolean value. If these functions are not used in correct way they can cause unexpected results.

isset() and empty() are often viewed as functions that are opposite, however this is not always true. In this post I will explain the differences between these functions.

 

isset()

From PHP manual – isset():

isset — Determine if a variable is set and is not NULL

In other words, it returns true only when the variable is not null.

empty()
From PHP Manual – empty():

empty — Determine whether a variable is empty

In other words, it will return true if the variable is an empty string, false, array(), NULL, “0?, 0, and an unset variable.

is_null()
From PHP Manual – is_null():

is_null — Finds whether a variable is NULL

In other words, it returns true only when the variable is null. is_null() is opposite of isset(), except for one difference that isset() can be applied to unknown variables, but is_null() only to declared variables.

The table below is an easy reference for what these functions will return for different values. The blank spaces means the function returns bool(false).
Value of variable ($var) isset($var) empty($var) is_null($var)
“” (an empty string) bool(true) bool(true)
” ” (space) bool(true)
FALSE bool(true) bool(true)
TRUE bool(true)
array() (an empty array) bool(true) bool(true)
NULL bool(true) bool(true)
“0″ (0 as a string) bool(true) bool(true)
0 (0 as an integer) bool(true) bool(true)
0.0 (0 as a float) bool(true) bool(true)
var $var; (a variable declared, but without a value) bool(true) bool(true)
NULL byte (“\ 0″) bool(true)
=======================================
Copy From http://techtalk.virendrachandak.com/php-isset-vs-empty-vs-is_null/  By Virendra on January 21, 2012

Practice it CSE142 MT 06au 的一道题

Write a method named hasMidpoint that accepts three integers as parameters and returns true if one of the integers is the midpoint between the other two integers; that is, if one integer is exactly halfway between them. Your method should return false if no such midpoint relationship exists.
The integers could be passed in any order; the midpoint could be the 1st, 2nd, or 3rd. You must check all cases.
Calls such as the following should return true:
hasMidpoint(4, 6, 8)
hasMidpoint(2, 10, 6)
hasMidpoint(8, 8, 8)
hasMidpoint(25, 10, -5)
Calls such as the following should return false:
hasMidpoint(3, 1, 3)
hasMidpoint(1, 3, 1)
hasMidpoint(21, 9, 58)
hasMidpoint(2, 8, 16)
=========================================================
以下是我和晓天想出来的答案。我们最开始打算先进行排序,再求差,来判断,很是程序写起来会很长,而且我们现在没有讲各种排序法。
=========================================================

public static boolean hasMidpoint(int a,int b,int c){
    int e=a+b+c;
    if (e/3==a||e/3==b||e/3==c)
        return true;
    return false;
}

=============================================================

# name expected return your return result
1 hasMidpoint(1, 2, 3) true true pass
2 hasMidpoint(2, 10, 6) true true pass
3 hasMidpoint(0, -50, -25) true true pass
4 hasMidpoint(21, 9, 58) false false pass
5 hasMidpoint(-2, 9, 27) false false pass
=================================================
提交答案之后,我突然觉得这个程序存在问题,虽然在系统给的数值里没有测出问题,但是由于int类数据的特点,10/3是等于3的。所以输入以下测试代码。
==================================================

public class test{
public static void main(String[] args){
System.out.println(hasMidpoint(0,-51,-25));
}
public static boolean hasMidpoint(int a,int b,int c){
int e=a+b+c;
if (e/3==a||e/3==b||e/3==c)
return true;
return false;
}
}

//由于是复制过来的,就不能保持很好的代码格式了。

=============================================================
输出结果:true
=============================================================
很显然,-25不是-51和0的中点,刚刚的源码是有问题的。
=================================================
把if的条件语句作了如下调整:

if ((e/3==a||e/3==b||e/3==c)&&e%3==0)

再次调用

System.out.println(hasMidpoint(0,-501,-250));

输出是false
=================================================
现在基本已经不会存在问题了,通过了我的所有测试。
如果有人认为我的代码还存在问题,欢迎回复。

[C/C++]关于void main和int main的问题

void main与int main之间的区别是什么?”这是一个常见的问题。我们来探讨一下这个问题,并深入研究一些有关main()函数不同版本的更多的东西。

C与C++在main()函数方面的标准有所不同,所以我们要分开讨论。

对于C语言:

在C89标准中,main() 的形式是可以接受的,当然使用如下的C99标准更明智,因为在这个标准中只有如下格式才能被接受:

int main ( void )
int main ( int argc, char *argv[] )

我们可以对main函数做轻微的改变,比如我们可以用一个自定义的类型代替int(当然这个类型必须被定义为int型),还可以把*argv[]改为**argv,等等。

如果我们不想在命令行下对程序输入参数,可以选择第一种形式。

其实第二种形式的两个参数argc,argv的名称是可以改变的,但保持原样是更明智的选择。

main()函数的返回类型必须为int;返回的整形值作为传递给调用者的一个返回码。(this allows a return code to be passed to the invoker)

对于C++:

以下是可以接受的格式:

int main ( int argc, char *argv[] )
int main ()

第一种格式遵从C99标准;第二种格式在不需要通过命令行向程序传递参数时使用,与C99标准中规定的格式int main(void)效果相同。

(C)int main()与int main(void)之间的区别:

很多C程序员都曾搞错的一个概念,就是以为这样一个函数不接受任何参数:

int foo();

事实上,这个函数被认为可以接受未知个数的参数(译:可接受任意多的参数!)。正确的用法是在括号内添加关键字void。

转自: < type="text/javascript">document.write(‘http://qbar.qq.com/u2014091/r/?97’)http://qbar.qq.com/u2014091/r/?97
void main()函数是如何处理的?

在C/C++正规的调用/返回函数中,如果你不想让一个函数返回任何值,你可以使用void定义返回类型。比如,一个不接受任何参数并且无任何返回值的函数原型可以像这样:

void foo(void);

一个常见的误解是,这种逻辑同样适用于main()函数。呵呵,事实并非如此,main()函数是很特殊的,无论何时你都应该依照标准定义main()函数(译:即使用int main()的形式!),并把返回值定义为int。有时void main()的例外形式是可以出现的,但这仅限于某些特定的系统。如果你不敢肯定正在使用这些系统,那么答案很简单,不能使用void main()的形式。

如果你在论坛上写了像“void main”这样的代码而被警告,那么最好改过来。不要用”我的老师告诉我这么做是对的”之类的话来为自己开脱;老师们总是习惯犯错误(teachers have a bad habit of being wrong)。写安全的,合乎标准的代码,大家就可以专注于你程序中其它的问题而不是在这种规范方面的东西上浪费时间。

但是int main(int argc, char *argv[], char *envp[])又是怎么回事呢?

好比是标准的扩展版,main()函数可以在一些系统中提取一个额外的参数用来访问环境变量。这个用法不能保证在每个编译环境中都行得通,所以使用 envp 这个参数是还是谨慎为妙。

最后,关于为什么void main(void)是一种错误的用法,这个链接提供了一些更细节化的背景资料:
http://users.aber.ac.uk/auj/voidmain.shtml
总之,尽量用int main()这个更标准,程序也会更安全。
以上内容来自CSDN博客:http://blog.csdn.net/zdanysdbb/archive/2009/01/13/3758148.aspx
———————————————————————————————————

1。在C++标准中main函数是int的而不是void的。标准C++要求main有int型返回值。而在C中允许void main()即main()无返回值 。C++标准虽然不允许 main为void型,但是在一些编译器比如VC6上允许main为void型, 头文件申明为#include(C++中.h的头文件是对C的支持,是非模板化的) 。但效率低!

2。使用int主要是可以给操作系统返回一个值,让操作系统明白这个程序执行的状态,比如执行这个程序后下一步可能要根据这个返回值做分支处理,如果是void的话就是一个哑巴程序,异常退出和正常推出无法区别,的确移植性很差。

3。1998年后的c++标准写法只有两种:
int main()
int main(int argc, char *argc[])
建议使用这两种之一

4。一定要用的话,可以通过#include来实现对C的支持。
#include
using namespace std;
void main()
{
cout<<"hello,world!"<